...
[iramuteq] / analysetxt.py
1 # -*- coding: utf-8 -*-
2 # Author: Pierre Ratinaud
3 # lisence : GNU GPL
4 # copyright : 2012-2013 (c) Pierre Ratinaud
5
6 import logging
7 from chemins import PathOut
8 from functions import exec_rcode, check_Rresult, DoConf, ReadDicoAsDico, progressbar
9 from shutil import copy
10 from time import time, sleep
11 from uuid import uuid4
12 import os
13 from openanalyse import OpenAnalyse
14 from dialog import StatDialog
15
16 log = logging.getLogger('iramuteq.analyse')
17
18 class AnalyseText :
19     def __init__(self, ira, corpus, parametres=None, dlg=False, lemdial=True) :
20         self.corpus = corpus
21         self.ira = ira
22         self.parent = ira
23         self.dlg = dlg
24         self.dialok = True
25         self.parametres = parametres
26         self.lemdial = lemdial
27         self.val = False
28         self.keys = DoConf(self.ira.ConfigPath['key']).getoptions()
29         if not 'pathout' in self.parametres :
30             self.pathout = PathOut(corpus.parametres['originalpath'], analyse_type=parametres['type'], dirout=corpus.parametres['pathout'])
31         else :
32             self.pathout = PathOut(filename=corpus.parametres['originalpath'], dirout=self.parametres['pathout'], analyse_type=self.parametres['type'])
33         self.parametres = self.lemparam()
34         if self.parametres is not None :
35             self.parametres = self.make_config(parametres)
36         log.info(self.pathout.dirout)
37         if self.parametres is not None :
38             self.keys = DoConf(self.ira.ConfigPath['key']).getoptions()
39             gramact = [k for k in self.keys if self.keys[k] == 1]
40             gramsup = [k for k in self.keys if self.keys[k] == 2]
41             self.parametres['pathout'] = self.pathout.mkdirout()
42             self.pathout = PathOut(dirout=self.parametres['pathout'])
43             self.pathout.createdir(self.parametres['pathout'])
44             self.parametres['corpus'] = self.corpus.parametres['uuid']
45             self.parametres['uuid'] = str(uuid4())
46             self.parametres['name'] = os.path.split(self.parametres['pathout'])[1]
47             self.parametres['type'] = parametres['type']
48             self.parametres['encoding'] = self.ira.syscoding
49             self.t1 = time()
50             if not self.parametres.get('dictionary', False) :
51                 self.corpus.make_lems(lem=self.parametres['lem'])
52             else :
53                 print 'read new dico'
54                 dico = ReadDicoAsDico(self.parametres['dictionary'])
55                 self.corpus.make_lems_from_dict(dico, dolem=self.parametres['lem'])
56                 dictname = os.path.basename(self.parametres['dictionary'])
57                 dictpath = os.path.join(self.pathout.dirout, dictname)
58                 copy(self.parametres['dictionary'], dictpath)
59                 self.parametres['dictionary'] = dictpath
60             self.corpus.parse_active(gramact, gramsup)
61             if dlg :
62                 self.dlg = progressbar(self.ira, dlg)
63             result_analyse = self.doanalyse()
64             if result_analyse is None :
65                 self.time = time() - self.t1
66                 minutes, seconds = divmod(self.time, 60)
67                 hours, minutes = divmod(minutes, 60)            
68                 self.parametres['time'] = '%.0fh %.0fm %.0fs' % (hours, minutes, seconds)
69                 self.parametres['ira'] = self.pathout['Analyse.ira']
70                 DoConf().makeoptions([self.parametres['type']], [self.parametres], self.pathout['Analyse.ira'])
71                 self.ira.history.add(self.parametres)
72                 if dlg :
73                     if not isinstance(dlg, int) :
74                         dlg.Destroy()
75                     self.dlg.Destroy()
76                     OpenAnalyse(self.parent, self.parametres['ira'])
77                     self.ira.tree.AddAnalyse(self.parametres)
78                     self.val = 5100
79             else :
80                 self.val = False
81                 if dlg :
82                     try :
83                         self.dlg.Destroy()
84                     except :
85                         pass
86         else :
87             #if isinstance(dlg, wx.ProgressDialog) :
88             #    self.dlg.Destroy()
89             self.val = False
90
91     def doanalyse(self) :
92         pass
93
94     def lemparam(self) :
95         if self.dlg and self.lemdial:
96             dial = StatDialog(self.parent, self.keys)
97             dial.CenterOnParent()
98             val = dial.ShowModal()
99             if val == 5100 :
100                 if dial.radio_lem.GetSelection() == 0 :
101                     lem = 1
102                 else :
103                     lem = 0            
104                 self.parametres['lem'] = lem
105                 if dial.radio_dictchoice.GetSelection() == 1 :
106                     self.parametres['dictionary'] = dial.dictpath.GetValue() 
107                 dial.Destroy()
108                 return self.parametres
109             else :
110                 dial.Destroy()
111                 return None        
112         else :
113             return self.parametres
114
115     def make_config(self, config) :
116         if config is not None :
117             if not self.dlg : 
118                 return config
119             else :
120                 return self.preferences()
121         else :
122             return None
123
124     def readconfig(self, config) :
125         return config
126
127     def preferences(self) :
128         return self.parametres
129
130     def printRscript(self) :
131         pass
132
133     def doR(self, Rscript, wait=False, dlg=None, message='') :
134         log.info('R code...')
135         pid = exec_rcode(self.ira.RPath, Rscript, wait=wait)
136         while pid.poll() is None :
137             if dlg :
138                 self.dlg.Pulse(message)
139                 sleep(0.2)
140             else :
141                 sleep(0.2)
142         return check_Rresult(self.ira, pid)