Enregistrement des métadonnées des patients.
authorpin <pin@fe552daf-6dbe-4428-90eb-1537e0879342>
Thu, 29 Jul 2010 15:57:35 +0000 (15:57 +0000)
committerpin <pin@fe552daf-6dbe-4428-90eb-1537e0879342>
Thu, 29 Jul 2010 15:57:35 +0000 (15:57 +0000)
git-svn-id: https://svn.cri.ensmp.fr/svn/minwii/trunk@305 fe552daf-6dbe-4428-90eb-1537e0879342

src/minwii/loganalyse.py
src/minwii/logapp.py
src/minwii/logfilereader.py

index 1a1f676..ec1b025 100755 (executable)
@@ -16,8 +16,8 @@ from datetime import timedelta
 PLAYING_MODES = dict(PLAYING_MODES)
 
 DEFAULT_STATS = (#'geometricmean',
-                 #'harmonicmean',
-                 #'mean',
+                 ('harmonicmean', 'Moyenne harmonique'),
+                 ('mean', 'Moyenne  '),
                  ('median', 'Médiane'),
                  #'medianscore',
                  #'mode',
index 555c9fd..a97e849 100755 (executable)
@@ -25,6 +25,7 @@ class Application(Frame) :
         self.createWidgets()
         self.logDir = ''
         self.logFiles = []
+        self.currentFilePath = ''
         self.resultsFrame = None
         
         if os.path.exists(LOGS_DIR) :
@@ -101,12 +102,14 @@ class Application(Frame) :
     def loadLogFile(self, nav) :
         index = nav.index - 1
         filepath = self.logFiles[index]
-        filename = basename(filepath)
-        self.identFrame.setFileName(filename)
+        self.currentFilePath = filepath
+        lfa = LogFileAnalyser(self.currentFilePath)
+        self.identFrame.refresh(lfa)
         if self.resultsFrame :
             self.resultsFrame.destroy()
-        self.resultsFrame = ResultsFrame(self.dataFrame, filepath)
-        self.resultsFrame.layResults()
+        self.resultsFrame = ResultsFrame(self.dataFrame)
+        self.resultsFrame.layResults(lfa)
+        lfa.close()
         self.resultsFrame.grid()
 
 
@@ -170,10 +173,19 @@ class Identification(Frame) :
     def __init__(self, master=None) :
         Frame.__init__(self, master)
         self.fileName = StringVar()
+        self.patientName = StringVar()
         self.createWidgets()
     
-    def setFileName(self, name) :
-        self.fileName.set(name)
+    #def setFileName(self, name) :
+    #    self.fileName.set(name)
+    
+    def refresh(self, lfa) :
+        filename = basename(lfa.logfile.name)
+        self.fileName.set(filename)
+        metadata = lfa.getMetadata()
+        self.patientName.set(metadata.get('PatientName', ''))
+        self.commentsText.delete(1.0, END)
+        self.commentsText.insert(1.0, metadata.get('Comments', ''))
     
     def createWidgets(self) :
         fileLbl = Label(self, text='Fichier :')
@@ -185,7 +197,7 @@ class Identification(Frame) :
         nameLbl = Label(self, text='Patient :')
         nameLbl.grid(row=1, column=0, sticky=E)
         
-        self.nameEntry = Entry(self, width=40)
+        self.nameEntry = Entry(self, width=40, textvariable=self.patientName)
         self.nameEntry.grid(row=1, column=1, sticky=W)
         
         commentsLbl = Label(self, text='Commentaires :')
@@ -193,14 +205,24 @@ class Identification(Frame) :
         
         self.commentsText = Text(self, width=40, height=4, undo=True, wrap=WORD)
         self.commentsText.grid(row=2, column=1, sticky=W)
+        
+        self.saveBtn = Button(self, text='Enregistrer', command=self.saveMetadata)
+        self.saveBtn.grid(row=3, column=1, sticky=E)
+    
+    def saveMetadata(self):
+        app = self.master.master
+        filepath = app.currentFilePath
+        lfa = LogFileAnalyser(filepath, mode='r+')
+        patientName = '%s\n' % self.nameEntry.get().replace('\n', ' ').strip()
+        comments = '%s\n' % self.commentsText.get(1.0, END).replace('\n', ' ').strip()
+        metadata = (('PatientName', self.nameEntry.get()),
+                    ('Comments', comments))
+        lfa.setMetadata(metadata)
+
 
 class ResultsFrame(Frame) :
-    def __init__(self, master, logFilePath) :
-        Frame.__init__(self, master)
-        self.logFilePath = logFilePath
     
-    def layResults(self) :
-        lfa = LogFileAnalyser(self.logFilePath)
+    def layResults(self, lfa) :
         results = lfa.analyse()
         if results :
             for i, kv in enumerate(results) :
index 828b085..50da29c 100755 (executable)
@@ -31,12 +31,12 @@ class LogFileReader(object) :
     classe utilitaire pour l'accès aux données d'un fichier de log MinWii.
     """
     
-    def __init__(self, logfile) :
+    def __init__(self, logfile, mode='r') :
         """ logfile : chemin d'accès au fichier de log MinWii.
             le format supporté est actuellement la version 1.0 uniquement.
         """
         if isinstance(logfile, StringTypes) :
-            self.logfile = open(logfile, 'r')
+            self.logfile = open(logfile, mode)
         else :
             self.logfile = logfile
         
@@ -121,7 +121,7 @@ class LogFileReader(object) :
         return lastTicks
     
     def __del__(self) :
-        self.logfile.close()
+        self.close()
     
     def __iter__(self) :
         return self
@@ -160,6 +160,36 @@ class LogFileReader(object) :
         while line :
             yield line.strip()
             line = br.readline()
+    
+    @inplaceread
+    def getMetadata(self) :
+        metadata = {}
+        self.next() # skip identification line.
+        line = self.next()
+        while line.startswith('METADATA ') :
+            line = line.split(None, 1)[1]
+            name, value = [v.strip() for v in line.split(':', 1)]
+            metadata[name] = value
+            line = self.next()
+        return metadata
+    
+    def setMetadata(self, metadata) :
+        f = self.logfile
+        f.seek(0)
+        before = f.readline()
+        after = f.read()
+        
+        lines = []
+        for name, value in metadata :
+            lines.append('METADATA %s : %s' % (name, value.encode('utf-8')))
+        metadata = '\n'.join(lines)
+        f.seek(0)
+        f.write(before)
+        f.write(metadata)
+        f.write(after)
+    
+    def close(self) :
+        self.logfile.close()
         
                 
 
@@ -232,5 +262,4 @@ class LogFilePlayer(PlayingScreenBase) :
             previousTicks = ticks
         
         self.stop()
-        
     
\ No newline at end of file