Prise en charge de l'analyseur de logs dans l'installateur Windows.
[minwii.git] / src / minwii / loganalyse.py
index d6d5a4d..1a1f676 100755 (executable)
@@ -6,21 +6,25 @@ $Id$
 $URL$
 """
 
 $URL$
 """
 
-from logfilereader import LogFileReader
+from minwii.logfilereader import LogFileReader
 from pprint import pprint
 from pprint import pprint
-from musicxml import musicXml2Song
+from minwii.musicxml import musicXml2Song
+from minwii.globals import PLAYING_MODES
 from statlib import stats
 from statlib import stats
+from datetime import timedelta
 
 
-DEFAULT_STATS = ('geometricmean',
-                 'harmonicmean',
-                 'mean',
-                 'median',
-                 'medianscore',
+PLAYING_MODES = dict(PLAYING_MODES)
+
+DEFAULT_STATS = (#'geometricmean',
+                 #'harmonicmean',
+                 #'mean',
+                 ('median', 'Médiane'),
+                 #'medianscore',
                  #'mode',
                  #'mode',
-                 'moment',
-                 'variation',
-                 'skew',
-                 'kurtosis',
+                 #'moment',
+                 ('variation', 'Variation'),
+                 #'skew',
+                 ('kurtosis', 'Kurtosis'),
                  #'itemfreq',
                  #'histogram',
                  #'cumfreq',
                  #'itemfreq',
                  #'histogram',
                  #'cumfreq',
@@ -30,10 +34,12 @@ DEFAULT_STATS = ('geometricmean',
 def statsresults(m) :
     def computeList(self):
         l = m(self)
 def statsresults(m) :
     def computeList(self):
         l = m(self)
-        ret = {}
-        for name in DEFAULT_STATS :
-            ret[name] = getattr(stats, name)(l)
-        return ret
+        results = []
+        for name, label in DEFAULT_STATS :
+            results.append('%s : %s' % (label, getattr(stats, name)(l)))
+        return '\n'.join(results)
+    computeList.__name__ = m.__name__
+    computeList.__doc__ = m.__doc__
     return computeList
 
 class LogFileAnalyser(LogFileReader) :
     return computeList
 
 class LogFileAnalyser(LogFileReader) :
@@ -62,41 +68,51 @@ class LogFileAnalyser(LogFileReader) :
                         }
     
     def analyse(self) :
                         }
     
     def analyse(self) :
-        results = {}
+        results = []
         
         try :
             self.mode = mode = self.getMode()
         
         try :
             self.mode = mode = self.getMode()
-            results['playingMode'] = mode
+            results.append(('Mode de jeu', PLAYING_MODES.get(mode, mode)))
             for name in self.POSSIBLE_ANALYSES[mode] :
                 meth = getattr(self, name)
             for name in self.POSSIBLE_ANALYSES[mode] :
                 meth = getattr(self, name)
-                results[name] = meth()
+                results.append((meth.__doc__, meth()))
         except :
         except :
-            pass
+            raise
         
         return results
     
         
         return results
     
+    def _toTimeDelta(self, milliseconds) :
+        duration = milliseconds / 1000.
+        duration = int(round(duration, 0))
+        return str(timedelta(seconds=duration))
+    
     def playingDuration(self) :
     def playingDuration(self) :
-        """ retourne la durée écoulée entre le premier et de dernier message
-            de type événement : correspond à la durée d'interprétation.
-        """
+        'Temps de jeu'
+        #retourne la durée écoulée entre le premier et de dernier message
+        #de type événement : correspond à la durée d'interprétation.
+        
         last = self.getLastEventTicks()
         first = self.getFirstEventTicks()
         last = self.getLastEventTicks()
         first = self.getFirstEventTicks()
-        return last - first
+        return self._toTimeDelta(last - first)
+        
     
     def songDuration(self) :
     
     def songDuration(self) :
-        """ retourne la durée de référence de la chanson
-            en prenant en compte le tempo présent dans la transcription
-            et en effectuant toutes les répétitions des couplets / refrains.
-        """
+        'Durée de référence de la chanson'
+        #retourne la durée de référence de la chanson
+        #en prenant en compte le tempo présent dans la transcription
+        #et en effectuant toutes les répétitions des couplets / refrains.
+        
         songFile = self.getSongFile()
         song = musicXml2Song(songFile)
         duration = 0
         for note, verseIndex in song.iterNotes() :
             duration = duration + note.duration
         songFile = self.getSongFile()
         song = musicXml2Song(songFile)
         duration = 0
         for note, verseIndex in song.iterNotes() :
             duration = duration + note.duration
-        return duration * song.quarterNoteDuration
+        duration = duration * song.quarterNoteDuration # en milisecondes
+        return self._toTimeDelta(duration)
     
     @statsresults
     def noteEndNoteOnLatency(self) :
     
     @statsresults
     def noteEndNoteOnLatency(self) :
+        'Réactivité'
         eIter = self.getEventsIterator()
         latencies = []
         lastnoteEndT = 0
         eIter = self.getEventsIterator()
         latencies = []
         lastnoteEndT = 0
@@ -122,19 +138,21 @@ class LogFileAnalyser(LogFileReader) :
         return cpt
     
     def realisationRate(self) :
         return cpt
     
     def realisationRate(self) :
-        """ taux de réalisation en nombre de note
-            peut être supérieur à 100 % car la chanson
-            boucle à l'infini.
-        """
+        'Taux de réalisation'
+        #taux de réalisation en nombre de note
+        #peut être supérieur à 100 % car la chanson
+        #boucle à l'infini.
+        
         songFile = self.getSongFile()
         song = musicXml2Song(songFile)
         songNoteCpt = 0
         for note, verseIndex in song.iterNotes() :
             songNoteCpt = songNoteCpt + 1
         
         songFile = self.getSongFile()
         song = musicXml2Song(songFile)
         songNoteCpt = 0
         for note, verseIndex in song.iterNotes() :
             songNoteCpt = songNoteCpt + 1
         
-        return int(round(self.noteOnCount() / float(songNoteCpt) * 100, 0))
+        return round(self.noteOnCount() / float(songNoteCpt) * 100, 1)
     
     def missCount(self) :
     
     def missCount(self) :
+        "Nombre d'erreurs"
         eIter = self.getEventsIterator()
         miss = 0
         if self.mode in ('EASY', 'NORMAL') :
         eIter = self.getEventsIterator()
         miss = 0
         if self.mode in ('EASY', 'NORMAL') :