...
[iramuteq] / iramuteq.py
index 5d64a17..21453e9 100644 (file)
@@ -47,18 +47,19 @@ from tabchdalc import AnalyseQuest
 from tabsimi import DoSimi
 from tabrsimple import InputText
 from tabverges import Prototypical
 from tabsimi import DoSimi
 from tabrsimple import InputText
 from tabverges import Prototypical
+from tabsplitvar import SplitMatrixFromVar
 #from textafcuci import AfcUci
 #from textafcuci import AfcUci
-from analysetxt import Alceste
 from textdist import AnalysePam
 from textstat import Stat
 from textaslexico import Lexico
 from textsimi import SimiTxt, SimiFromCluster
 from textwordcloud import WordCloud, ClusterCloud
 from textdist import AnalysePam
 from textstat import Stat
 from textaslexico import Lexico
 from textsimi import SimiTxt, SimiFromCluster
 from textwordcloud import WordCloud, ClusterCloud
+from textreinert import Reinert
 #from profile_segment import ProfileSegment
 #from textcheckcorpus import checkcorpus
 from openanalyse import OpenAnalyse
 #from profile_segment import ProfileSegment
 #from textcheckcorpus import checkcorpus
 from openanalyse import OpenAnalyse
-from corpus import Builder
-from sheet import MySheet
+from corpus import Builder, SubBuilder
+#from sheet import MySheet
 from checkinstall import CreateIraDirectory, CheckRPath, FindRPAthWin32, FindRPathNix, CheckRPackages, IsNew, UpgradeConf, CopyConf, RLibsAreInstalled
 from chemins import RscriptsPath, ConstructConfigPath, ConstructDicoPath, ConstructGlobalPath, PathOut
 from parse_factiva_xml import ImportFactiva
 from checkinstall import CreateIraDirectory, CheckRPath, FindRPAthWin32, FindRPathNix, CheckRPackages, IsNew, UpgradeConf, CopyConf, RLibsAreInstalled
 from chemins import RscriptsPath, ConstructConfigPath, ConstructDicoPath, ConstructGlobalPath, PathOut
 from parse_factiva_xml import ImportFactiva
@@ -74,11 +75,11 @@ ID_Freq = wx.NewId()
 ID_Chi2 = wx.NewId()
 ID_Student = wx.NewId()
 ID_CHDSIM = wx.NewId()
 ID_Chi2 = wx.NewId()
 ID_Student = wx.NewId()
 ID_CHDSIM = wx.NewId()
-ID_CHDAlceste = wx.NewId()
+ID_CHDReinert = wx.NewId()
 ID_TEXTAFCM = wx.NewId()
 ID_TEXTSTAT = wx.NewId()
 ID_ASLEX = wx.NewId()
 ID_TEXTAFCM = wx.NewId()
 ID_TEXTSTAT = wx.NewId()
 ID_ASLEX = wx.NewId()
-ID_TEXTALCESTE = wx.NewId()
+ID_TEXTREINERT = wx.NewId()
 ID_TEXTPAM = wx.NewId()
 ID_CHECKCORPUS = wx.NewId()
 ID_Tabcontent = wx.NewId()
 ID_TEXTPAM = wx.NewId()
 ID_CHECKCORPUS = wx.NewId()
 ID_Tabcontent = wx.NewId()
@@ -191,7 +192,7 @@ class IraFrame(wx.Frame):
         item.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_FILE_OPEN))
         file_menu.AppendItem(item)
         
         item.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_FILE_OPEN))
         file_menu.AppendItem(item)
         
-        item = wx.MenuItem(file_menu, ID_OpenText, _(u"Open a text corpora").decode('utf8'), _(u"Open a text corpora").decode('utf8'))
+        item = wx.MenuItem(file_menu, ID_OpenText, _(u"Open a text corpus").decode('utf8'), _(u"Open a text corpus").decode('utf8'))
         item.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_FILE_OPEN))
         file_menu.AppendItem(item)
         
         item.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_FILE_OPEN))
         file_menu.AppendItem(item)
         
@@ -216,16 +217,19 @@ class IraFrame(wx.Frame):
         menuTools = wx.Menu()
         splitvar = wx.MenuItem(menuTools, wx.ID_ANY, _(u"Split from variable").decode('utf8'))
         extractmod = wx.MenuItem(menuTools, wx.ID_ANY, _(u"Extract mods").decode('utf8'))
         menuTools = wx.Menu()
         splitvar = wx.MenuItem(menuTools, wx.ID_ANY, _(u"Split from variable").decode('utf8'))
         extractmod = wx.MenuItem(menuTools, wx.ID_ANY, _(u"Extract mods").decode('utf8'))
+        extractthem = wx.MenuItem(menuTools, wx.ID_ANY, _(u"Extract thematics").decode('utf8'))
         menuTools.AppendItem(splitvar)
         menuTools.AppendItem(extractmod)
         menuTools.AppendItem(splitvar)
         menuTools.AppendItem(extractmod)
+        menuTools.AppendItem(extractthem)
         self.ID_splitvar = splitvar.GetId()
         self.ID_extractmod = extractmod.GetId()
         self.ID_splitvar = splitvar.GetId()
         self.ID_extractmod = extractmod.GetId()
-        file_menu.AppendMenu(-1, _(u"Tools"), menuTools)
+        self.ID_extractthem = extractthem.GetId()
+        file_menu.AppendMenu(-1, _(u"Tools").decode('utf8'), menuTools)
 
                
 
                
-        item = wx.MenuItem(file_menu, ID_SaveTab, _(u"Save tab as...").decode('utf8'), _(u"Save tab as...").decode('utf8'))
-        item.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_FILE_SAVE_AS))
-        file_menu.AppendItem(item)
+        #item = wx.MenuItem(file_menu, ID_SaveTab, _(u"Save tab as...").decode('utf8'), _(u"Save tab as...").decode('utf8'))
+        #item.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_FILE_SAVE_AS))
+        #file_menu.AppendItem(item)
         
         file_menu.Append(wx.ID_EXIT, _(u"Exit").decode('utf8'))
         
         
         file_menu.Append(wx.ID_EXIT, _(u"Exit").decode('utf8'))
         
@@ -237,42 +241,48 @@ class IraFrame(wx.Frame):
         view_menu.Append(ID_VIEWDATA, _(u"Show data").decode('utf8'))
         view_menu.Append(ID_RESULT, _(u'Show results').decode('utf8'))
         #view_menu.AppendSeparator()
         view_menu.Append(ID_VIEWDATA, _(u"Show data").decode('utf8'))
         view_menu.Append(ID_RESULT, _(u'Show results').decode('utf8'))
         #view_menu.AppendSeparator()
-
-        analyse_menu = wx.Menu()
-        analyse_menu.Append(ID_Freq, _(u"Frequencies").decode('utf8'))
-        analyse_menu.Append(ID_Chi2, _(u"Chi2").decode('utf8'))
-        #analyse_menu.Append(ID_Student, u"t de Student")
+        matrix_menu = wx.Menu()
+        matrix_menu.Append(ID_Freq, _(u"Frequencies").decode('utf8'))
+        matrix_menu.Append(ID_Chi2, _(u"Chi2").decode('utf8'))
+        #matrix_menu.Append(ID_Student, u"t de Student")
         menu_classif = wx.Menu()
         menu_classif = wx.Menu()
-        menu_classif.Append(ID_CHDAlceste, _(u"Reinert Method").decode('utf8'))
+        menu_classif.Append(ID_CHDReinert, _(u"Reinert's Method").decode('utf8'))
         #menu_classif.Append(ID_CHDSIM, u"Par matrice des distances")
         #menu_classif.Append(ID_CHDSIM, u"Par matrice des distances")
-        analyse_menu.AppendMenu(-1, _(u"Clustering").decode('utf8'), menu_classif)
-        #analyse_menu.Append(ID_AFCM, u"AFCM")
-        analyse_menu.Append(ID_SIMI, _(u"Similarities Analysis").decode('utf8'))
-        analyse_menu.Append(ID_proto, _(u"Prototypical analysis").decode('utf8'))
+        matrix_menu.AppendMenu(-1, _(u"Clustering").decode('utf8'), menu_classif)
+        #matrix_menu.Append(ID_AFCM, u"AFCM")
+        matrix_menu.Append(ID_SIMI, _(u"Similarities Analysis").decode('utf8'))
+        matrix_menu.Append(ID_proto, _(u"Prototypical Analysis").decode('utf8'))
         ID_RCODE = wx.NewId()
         ID_RCODE = wx.NewId()
-        analyse_menu.Append(ID_RCODE, u"Code R...")
-
+        matrix_menu.Append(ID_RCODE, u"Code R...") 
+        #menu_splittab = wx.Menu()
+        #ID_SPLITVAR = wx.NewId()
+        #splitvar = wx.MenuItem(menu_splittab, ID_SPLITVAR, _(u"Split from variable").decode('utf8'))
+        #menu_splittab.AppendItem(splitvar)
+        #matrix_menu.AppendMenu(-1, _(u"Split matrix").decode('utf8'), menu_splittab)
+        self.matrix_menu = matrix_menu
+        
         text_menu = wx.Menu()
         #text_menu.Append(ID_CHECKCORPUS, u"Vérifier le corpus")
         text_menu.Append(ID_TEXTSTAT, _(u"Statistics").decode('utf8'))
         text_menu.Append(ID_ASLEX, _(u"Specificities and CA").decode('utf8'))
         #text_menu.Append(ID_TEXTAFCM, u"AFC sur UCI / Vocabulaire")
         menu_classiftxt = wx.Menu()
         text_menu = wx.Menu()
         #text_menu.Append(ID_CHECKCORPUS, u"Vérifier le corpus")
         text_menu.Append(ID_TEXTSTAT, _(u"Statistics").decode('utf8'))
         text_menu.Append(ID_ASLEX, _(u"Specificities and CA").decode('utf8'))
         #text_menu.Append(ID_TEXTAFCM, u"AFC sur UCI / Vocabulaire")
         menu_classiftxt = wx.Menu()
-        menu_classiftxt.Append(ID_TEXTALCESTE, _(u"Reinert Method").decode('utf8'))
+        menu_classiftxt.Append(ID_TEXTREINERT, _(u"Reinert's Method").decode('utf8'))
         #menu_classiftxt.Append(ID_TEXTPAM, u"Par matrice des distances")
         text_menu.AppendMenu(-1, _(u"Clustering").decode('utf8'), menu_classiftxt)
         text_menu.Append(ID_SimiTxt, _(u"Similarities Analysis").decode('utf8')) 
         ID_WC = wx.NewId()
         text_menu.Append(ID_WC, _(u"WordCloud").decode('utf8'))
         #menu_classiftxt.Append(ID_TEXTPAM, u"Par matrice des distances")
         text_menu.AppendMenu(-1, _(u"Clustering").decode('utf8'), menu_classiftxt)
         text_menu.Append(ID_SimiTxt, _(u"Similarities Analysis").decode('utf8')) 
         ID_WC = wx.NewId()
         text_menu.Append(ID_WC, _(u"WordCloud").decode('utf8'))
+        self.text_menu = text_menu
         
         help_menu = wx.Menu()
         help_menu.Append(wx.ID_ABOUT, _(u"About...").decode('utf8'))
         
         help_menu = wx.Menu()
         help_menu.Append(wx.ID_ABOUT, _(u"About...").decode('utf8'))
-        help_menu.Append(wx.ID_HELP, _(u"Inline help...").decode('utf8'))
+        help_menu.Append(wx.ID_HELP, _(u"Online help...").decode('utf8'))
         
         self.mb.Append(file_menu, _(u"File").decode('utf8'))
         self.mb.Append(edit_menu, _(u"Edition").decode('utf8'))
         self.mb.Append(view_menu, _(u"View").decode('utf8'))
         
         self.mb.Append(file_menu, _(u"File").decode('utf8'))
         self.mb.Append(edit_menu, _(u"Edition").decode('utf8'))
         self.mb.Append(view_menu, _(u"View").decode('utf8'))
-        self.mb.Append(analyse_menu, _("Matrix analysis").decode('utf8'))
+        self.mb.Append(matrix_menu, _(u"Matrix analysis").decode('utf8'))
         self.mb.Append(text_menu, _(u"Text analysis").decode('utf8'))
         self.mb.Append(help_menu, _(u"Help").decode('utf8'))
         
         self.mb.Append(text_menu, _(u"Text analysis").decode('utf8'))
         self.mb.Append(help_menu, _(u"Help").decode('utf8'))
         
@@ -333,9 +343,9 @@ class IraFrame(wx.Frame):
         self._mgr.AddPane(self.nb, aui.AuiPaneInfo().
                               Name("Tab_content").
                               CenterPane())        
         self._mgr.AddPane(self.nb, aui.AuiPaneInfo().
                               Name("Tab_content").
                               CenterPane())        
-        self.Sheet = MySheet(self)
+        
         #self._mgr.AddPane(self.Sheet, wx.aui.AuiPaneInfo().Name("Data").CenterPane())
         #self._mgr.AddPane(self.Sheet, wx.aui.AuiPaneInfo().Name("Data").CenterPane())
-        self._mgr.AddPane(self.Sheet, aui.AuiPaneInfo().Name("Data").CenterPane())
+        #self._mgr.AddPane(self.Sheet, aui.AuiPaneInfo().Name("Data").CenterPane())
         self.nb.Bind(aui.EVT_AUINOTEBOOK_PAGE_CLOSE, self.OnCloseTab)
         self.nb.Bind(aui.EVT_AUINOTEBOOK_PAGE_CHANGED, self.OnPageChanged)
         # add the toolbars to the manager
         self.nb.Bind(aui.EVT_AUINOTEBOOK_PAGE_CLOSE, self.OnCloseTab)
         self.nb.Bind(aui.EVT_AUINOTEBOOK_PAGE_CHANGED, self.OnPageChanged)
         # add the toolbars to the manager
@@ -368,25 +378,27 @@ class IraFrame(wx.Frame):
         self.Bind(wx.EVT_MENU, self.import_factiva_txt, fact_from_txt)
         self.Bind(wx.EVT_MENU, self.ExtractTools, splitvar)
         self.Bind(wx.EVT_MENU, self.ExtractTools, extractmod)
         self.Bind(wx.EVT_MENU, self.import_factiva_txt, fact_from_txt)
         self.Bind(wx.EVT_MENU, self.ExtractTools, splitvar)
         self.Bind(wx.EVT_MENU, self.ExtractTools, extractmod)
+        self.Bind(wx.EVT_MENU, self.ExtractTools, extractthem)
         self.Bind(wx.EVT_MENU, self.OnFreq, id=ID_Freq)
         self.Bind(wx.EVT_MENU, self.OnChi2, id=ID_Chi2)
         self.Bind(wx.EVT_MENU, self.OnStudent, id=ID_Student)
         self.Bind(wx.EVT_MENU, self.OnCHDSIM, id=ID_CHDSIM)
         self.Bind(wx.EVT_MENU, self.OnFreq, id=ID_Freq)
         self.Bind(wx.EVT_MENU, self.OnChi2, id=ID_Chi2)
         self.Bind(wx.EVT_MENU, self.OnStudent, id=ID_Student)
         self.Bind(wx.EVT_MENU, self.OnCHDSIM, id=ID_CHDSIM)
-        self.Bind(wx.EVT_MENU, self.OnCHDAlceste, id=ID_CHDAlceste)
+        self.Bind(wx.EVT_MENU, self.OnCHDReinert, id=ID_CHDReinert)
         self.Bind(wx.EVT_MENU, self.OnAFCM, id=ID_AFCM)
         self.Bind(wx.EVT_MENU, self.OnProto, id=ID_proto)
         self.Bind(wx.EVT_MENU, self.OnRCode, id=ID_RCODE)
         self.Bind(wx.EVT_MENU, self.OnAFCM, id=ID_AFCM)
         self.Bind(wx.EVT_MENU, self.OnProto, id=ID_proto)
         self.Bind(wx.EVT_MENU, self.OnRCode, id=ID_RCODE)
+        #self.Bind(wx.EVT_MENU, self.OnSplitVar, id=ID_SPLITVAR)
         #self.Bind(wx.EVT_MENU, self.OnCheckcorpus, id = ID_CHECKCORPUS)
         self.Bind(wx.EVT_MENU, self.OnTextStat, id=ID_TEXTSTAT)
         self.Bind(wx.EVT_MENU, self.OnTextSpec, id=ID_ASLEX)
         self.Bind(wx.EVT_MENU, self.OnTextAfcm, id=ID_TEXTAFCM)
         #self.Bind(wx.EVT_MENU, self.OnCheckcorpus, id = ID_CHECKCORPUS)
         self.Bind(wx.EVT_MENU, self.OnTextStat, id=ID_TEXTSTAT)
         self.Bind(wx.EVT_MENU, self.OnTextSpec, id=ID_ASLEX)
         self.Bind(wx.EVT_MENU, self.OnTextAfcm, id=ID_TEXTAFCM)
-        self.Bind(wx.EVT_MENU, self.OnTextAlceste, id=ID_TEXTALCESTE)
+        self.Bind(wx.EVT_MENU, self.OnTextReinert, id=ID_TEXTREINERT)
         self.Bind(wx.EVT_MENU, self.OnPamSimple, id=ID_TEXTPAM)
         self.Bind(wx.EVT_MENU, self.OnSimiTxt, id=ID_SimiTxt)
         self.Bind(wx.EVT_MENU, self.OnWordCloud, id=ID_WC)
         self.Bind(wx.EVT_MENU, self.OnPamSimple, id=ID_TEXTPAM)
         self.Bind(wx.EVT_MENU, self.OnSimiTxt, id=ID_SimiTxt)
         self.Bind(wx.EVT_MENU, self.OnWordCloud, id=ID_WC)
-        self.Bind(wx.EVT_MENU, self.OnSimi, id=ID_SIMI)
+        self.Bind(wx.EVT_MENU, self.OnSimiTab, id=ID_SIMI)
         self.Bind(wx.EVT_MENU, self.OnExit, id=wx.ID_EXIT)
         self.Bind(wx.EVT_MENU, self.OnExit, id=wx.ID_EXIT)
-        self.Bind(wx.EVT_MENU, self.OnSaveTabAs, id=ID_SaveTab)
+        #self.Bind(wx.EVT_MENU, self.OnSaveTabAs, id=ID_SaveTab)
         self.Bind(wx.EVT_MENU, self.OnAbout, id=wx.ID_ABOUT)
         self.Bind(wx.EVT_MENU, self.OnHelp, id=wx.ID_HELP)
         self.Bind(wx.EVT_MENU, self.OnPref, id=wx.ID_PREFERENCES)
         self.Bind(wx.EVT_MENU, self.OnAbout, id=wx.ID_ABOUT)
         self.Bind(wx.EVT_MENU, self.OnHelp, id=wx.ID_HELP)
         self.Bind(wx.EVT_MENU, self.OnPref, id=wx.ID_PREFERENCES)
@@ -540,48 +552,21 @@ vous devez signaler le chemin de l'éxecutable de R dans les préférences."""
         print 'onclose'
         with open(self.ConfigPath['path'], 'w') as f :
             self.PathPath.write(f)
         print 'onclose'
         with open(self.ConfigPath['path'], 'w') as f :
             self.PathPath.write(f)
-        if self.DictTab != {} :
-            savestates = [self.DictTab[item][0] for item in self.DictTab]
-            if False in savestates :
-                notsave = [item for item in self.DictTab if self.DictTab[item][0] == False] 
-                msg = u"""
- Certains résultats ne sont pas enregistrés.
- Voulez-vous fermer quand même ?"""
-                dlg = wx.MessageDialog(self, msg, "Sauvegarde",
-                       wx.YES_NO | wx.NO_DEFAULT | wx.ICON_QUESTION)
-                dlg.CenterOnParent()
-                if dlg.ShowModal() in [wx.ID_NO, wx.ID_CANCEL]:
-                    event.Veto()
-                    dlg.Destroy()
-                else:
-                    dlg.Destroy()
-                    for item in notsave :
-                        for tmpfile in self.DictTab[item][1:] :
-                            os.remove(tmpfile)
-                            print 'remove : ' + tmpfile
-                    self._mgr.UnInit()
-                    del self._mgr
-                    self.Destroy()
-            else :
-                self._mgr.UnInit()
-                del self._mgr
-                self.Destroy()
-        else :
-            self._mgr.UnInit()
-            del self._mgr
-            self.Destroy()
-            #if sys.platform == 'win32' :
-            #    os.system("taskkill /im iramuteq.exe /f")
-            #    print 'meurtre de process'
+        self._mgr.UnInit()
+        del self._mgr
+        self.Destroy()
 
     def OnOpenData(self, event):
         inputname, self.input_path = OnOpen(self, "Data")
         if inputname:
 
     def OnOpenData(self, event):
         inputname, self.input_path = OnOpen(self, "Data")
         if inputname:
-            self.filename = self.input_path[0]
+            #filename = self.input_path[0]
             self.tableau = Tableau(self,os.path.abspath(self.input_path[0]))
             self.tableau = Tableau(self,os.path.abspath(self.input_path[0]))
-            get_table_param(self, self.input_path[0])
-            self.tableau.make_content()
-            self.tableau.show_tab()
+            val = get_table_param(self, self.input_path[0])
+            if val == wx.ID_OK :
+                self.tableau.make_content()
+                OpenAnalyse(self, self.tableau.parametres)
+                self.tree.OnItemAppend(self.tableau.parametres)
+                #self.tableau.show_tab()
 
     def OnOpenAnalyse(self, event):
         self.AnalysePath = OnOpen(self, "Analyse")
 
     def OnOpenAnalyse(self, event):
         self.AnalysePath = OnOpen(self, "Analyse")
@@ -612,7 +597,20 @@ vous devez signaler le chemin de l'éxecutable de R dans les préférences."""
                 self.DataPop = False
             self.ShowAPane(u"Text")
         self._mgr.Update()
                 self.DataPop = False
             self.ShowAPane(u"Text")
         self._mgr.Update()
-        
+    
+    def OnSubText(self, corpus, parametres = None):
+        if corpus is None :
+            corpus = self.tree.getcorpus()
+        builder = SubBuilder(self, corpus, parametres)
+        if builder.res == wx.ID_OK :
+            busy = wx.BusyInfo(_("Please wait...").decode('utf8'), self)
+            wx.SafeYield()
+            corpus = builder.doanalyse()
+            self.history.add(corpus.parametres)
+            self.tree.OnItemAppend(corpus.parametres)
+            OpenAnalyse(self, corpus.parametres)
+            del busy
+            
     def OpenText(self):
         dlg = wx.ProgressDialog("Ouverture...",
                                    "Veuillez patienter...",
     def OpenText(self):
         dlg = wx.ProgressDialog("Ouverture...",
                                    "Veuillez patienter...",
@@ -664,7 +662,7 @@ Laboratoire LERASS
 REPERE
 """
         info.WebSite = ("http://www.iramuteq.org", u"Site web IRaMuTeQ")
 REPERE
 """
         info.WebSite = ("http://www.iramuteq.org", u"Site web IRaMuTeQ")
-        dev = ConfigGlob.get('DEFAULT', 'dev').split(';')
+        dev = ConfigGlob.get('DEFAULT', 'dev').decode('utf8').split(';')
         info.Developers = dev
         info.License = u"""Iramuteq est un logiciel libre ; vous pouvez le diffuser et/ou le modifier 
 suivant les termes de la Licence Publique Générale GNU telle que publiée 
         info.Developers = dev
         info.License = u"""Iramuteq est un logiciel libre ; vous pouvez le diffuser et/ou le modifier 
 suivant les termes de la Licence Publique Générale GNU telle que publiée 
@@ -695,6 +693,12 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, États-Unis."""
             npage = self.nb.GetPage(new)
             if 'parametres' in dir(npage) :
                 self.tree.GiveFocus(uuid=npage.parametres['uuid'])
             npage = self.nb.GetPage(new)
             if 'parametres' in dir(npage) :
                 self.tree.GiveFocus(uuid=npage.parametres['uuid'])
+                if npage.parametres.get('matrix', False) :
+                    self.ShowMenu(_(u"Text analysis").decode('utf8'), False)
+                    self.ShowMenu(_(u"Matrix analysis").decode('utf8'), True)
+                elif npage.parametres.get('corpus', False) :
+                    self.ShowMenu(_(u"Text analysis").decode('utf8'))
+                    self.ShowMenu(_(u"Matrix analysis").decode('utf8'), False)
 
     def OnCloseTab(self, evt):
         #log.info('Closing tab %s' % str(evt.GetEventObject()))
 
     def OnCloseTab(self, evt):
         #log.info('Closing tab %s' % str(evt.GetEventObject()))
@@ -708,40 +712,40 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, États-Unis."""
             self.history.rmtab(page.parametres)
             self.tree.CloseItem(uuid = page.parametres['uuid'])
         TabTitle = self.nb.GetPageText(self.nb.GetSelection())
             self.history.rmtab(page.parametres)
             self.tree.CloseItem(uuid = page.parametres['uuid'])
         TabTitle = self.nb.GetPageText(self.nb.GetSelection())
-        if self.DictTab != {} :
-            if TabTitle in self.DictTab :
-                ListFile=self.DictTab[TabTitle]
-                if False in ListFile:
-                    msg = u"""
-Certains résultats ne sont pas enregistrer.
-Voulez-vous fermer quand même ?"""
-                    dlg = wx.MessageDialog(self, msg, "Sauvegarde",wx.YES_NO | wx.NO_DEFAULT | wx.ICON_QUESTION)
-
-                    dlg.CenterOnParent()
-                    if dlg.ShowModal() in [wx.ID_NO, wx.ID_CANCEL]:
-                        remove = False
-                        evt.Veto()
-                        dlg.Destroy()
-                    else :
-                        for f in ListFile[1:] :
-                            print 'remove', f
-                            os.remove(f)
-                            remove = True
-                        dlg.Destroy()
-                elif True in ListFile :
-                    remove = True
-                if remove:
-                    del self.DictTab[TabTitle]
-            else : 
-                self.LastTabClose()
-        else :
-            remove = True
-        if self.nb.GetPageCount() == 1 and remove and not notebook :
+        if self.DictTab != {} :
+            if TabTitle in self.DictTab :
+                ListFile=self.DictTab[TabTitle]
+                if False in ListFile:
+                    msg = u"""
+Certains résultats ne sont pas enregistrer.
+Voulez-vous fermer quand même ?"""
+                    dlg = wx.MessageDialog(self, msg, "Sauvegarde",wx.YES_NO | wx.NO_DEFAULT | wx.ICON_QUESTION)
+# 
+                    dlg.CenterOnParent()
+                    if dlg.ShowModal() in [wx.ID_NO, wx.ID_CANCEL]:
+                        remove = False
+                        evt.Veto()
+                        dlg.Destroy()
+                    else :
+                        for f in ListFile[1:] :
+                            print 'remove', f
+                            os.remove(f)
+                            remove = True
+                        dlg.Destroy()
+                elif True in ListFile :
+                    remove = True
+                if remove:
+                    del self.DictTab[TabTitle]
+            else : 
+                self.LastTabClose()
+#        else :
+#            remove = True
+        if self.nb.GetPageCount() == 1 and not notebook :
             self.LastTabClose()
     
     def LastTabClose(self) :
         if self.nb.GetPageCount() == 1 :
             self.LastTabClose()
     
     def LastTabClose(self) :
         if self.nb.GetPageCount() == 1 :
-            self.DisEnSaveTabAs(False)
+            #self.DisEnSaveTabAs(False)
             if self.DataTxt :
                 self.ShowAPane("Text")
             elif self.DataPop :
             if self.DataTxt :
                 self.ShowAPane("Text")
             elif self.DataPop :
@@ -749,39 +753,39 @@ Voulez-vous fermer quand même ?"""
             else :
                 self.ShowAPane("Intro_Text")
 
             else :
                 self.ShowAPane("Intro_Text")
 
-    def OnSaveTabAs(self, event):
-        SelectTab = self.nb.GetSelection()
-        TabTitle = self.nb.GetPageText(SelectTab)
-        FileToSave = self.DictTab[TabTitle]
-        NewListFile = []
-        dlg = wx.FileDialog(
-            self, message="Enregistrer sous...", defaultDir=os.getcwd(),
-            defaultFile="resultat.html", wildcard="Tous les fichiers|*", style=wx.SAVE | wx.OVERWRITE_PROMPT
-            )
-        dlg.SetFilterIndex(2)
-        dlg.CenterOnParent()
-        
-        if dlg.ShowModal() == wx.ID_OK:
-            Path = dlg.GetPath()
-            Dirname = os.path.dirname(Path)
-            Filename = dlg.GetFilename()
-        else :
-            Path = False
-        dlg.Destroy()
-        if Path:
-            shutil.copyfile(FileToSave[-1], Path)
-            os.remove(FileToSave[len(FileToSave) - 1])
-            NewListFile.append(True)
-            NewListFile.append(Path)
-            for f in FileToSave[1:-1] :
-                Fileout = os.path.join(Dirname, os.path.basename(f))
-                shutil.copyfile(f, Fileout)
-                NewListFile.append(Fileout)
-                os.remove(f)
-            TabText = Filename
-            self.DictTab[TabText] = NewListFile
-            del self.DictTab[TabTitle]
-            self.nb.SetPageText(SelectTab, TabText)
+    def OnSaveTabAs(self, event):
+        SelectTab = self.nb.GetSelection()
+        TabTitle = self.nb.GetPageText(SelectTab)
+        FileToSave = self.DictTab[TabTitle]
+        NewListFile = []
+        dlg = wx.FileDialog(
+            self, message="Enregistrer sous...", defaultDir=os.getcwd(),
+            defaultFile="resultat.html", wildcard="Tous les fichiers|*", style=wx.SAVE | wx.OVERWRITE_PROMPT
+            )
+        dlg.SetFilterIndex(2)
+        dlg.CenterOnParent()
+#         
+        if dlg.ShowModal() == wx.ID_OK:
+            Path = dlg.GetPath()
+            Dirname = os.path.dirname(Path)
+            Filename = dlg.GetFilename()
+        else :
+            Path = False
+        dlg.Destroy()
+        if Path:
+            shutil.copyfile(FileToSave[-1], Path)
+            os.remove(FileToSave[len(FileToSave) - 1])
+            NewListFile.append(True)
+            NewListFile.append(Path)
+            for f in FileToSave[1:-1] :
+                Fileout = os.path.join(Dirname, os.path.basename(f))
+                shutil.copyfile(f, Fileout)
+                NewListFile.append(Fileout)
+                os.remove(f)
+            TabText = Filename
+            self.DictTab[TabText] = NewListFile
+            del self.DictTab[TabTitle]
+            self.nb.SetPageText(SelectTab, TabText)
 
     def GetStartPosition(self):
 
 
     def GetStartPosition(self):
 
@@ -815,20 +819,42 @@ Voulez-vous fermer quand même ?"""
 ################################################################
 #debut des analyses
 ################################################################
 ################################################################
 #debut des analyses
 ################################################################
-
-    def OnFreq(self, event):
+    def analyse_matrix(self, analyse, analyse_type = '', matrix = None, dlgnb = 1):
+        if matrix is None :
+            matrix = self.tree.getmatrix()
+        #try :
+        analyse(self, matrix, parametres = {'type' : analyse_type}, dlg = progressbar(self, dlgnb))
+        #except:
+        #    BugReport(self)           
+
+    def OnFreq(self, event, matrix = None):
+        self.analyse_matrix(Frequences, analyse_type = 'freq', matrix = matrix, dlgnb = 3)
+        #if matrix is None :
+        #    matrix = self.tree.getmatrix()
+        #try:
+        #    Frequences(self, matrix, parametres = {'type' : 'freq'}, dlg = progressbar(self, 3)) 
+        #except:
+        #    BugReport(self)
+
+    def OnChi2(self, event, matrix = None):
+        #try:
+        self.analyse_matrix(ChiSquare, matrix = matrix, analyse_type = 'chi2', dlgnb = 3) 
+        #except:
+        #    BugReport(self)
+
+    def OnSimiTab(self, event, matrix = None):
+        if matrix is None :
+            matrix = self.tree.getmatrix()
         try:
         try:
-            Frequences(self
+            DoSimi(self, matrix, parametres = {'type' : 'simimatrix'}, dlg = progressbar(self, 3)
         except:
             BugReport(self)
         except:
             BugReport(self)
+
+    def OnCHDReinert(self, event, matrix = None):
+        if matrix is None :
+            matrix = self.tree.getmatrix()
+        AnalyseQuest(self, matrix, parametres = {'type' : 'reinertmatrix'}, dlg = progressbar(self, 3))
             
             
-    def OnChi2(self, event):
-        try:
-        #    print('PAS DE DEBUG SUR CHI2')
-            chi = ChiSquare(self)
-        except:
-            BugReport(self)
-    
     def OnStudent(self, event):
         try:
             MakeStudent(self) 
     def OnStudent(self, event):
         try:
             MakeStudent(self) 
@@ -850,17 +876,23 @@ Voulez-vous fermer quand même ?"""
         except:
             BugReport(self)
  
         except:
             BugReport(self)
  
-    def OnCHDAlceste(self, event):
-        try:
-         #   print('PLUS DE BUG SUR ALCESTE QUESTIONNAIRE')
-            self.quest = AnalyseQuest(self)
-            if self.quest.val == wx.ID_OK:
-                PlaySound(self)
-        except:
-            BugReport(self)
+#     def OnCHDReinert(self, event):
+        try:
+         #   print('PLUS DE BUG SUR ALCESTE QUESTIONNAIRE')
+            self.quest = AnalyseQuest(self)
+            if self.quest.val == wx.ID_OK:
+                PlaySound(self)
+        except:
+            BugReport(self)
     
     
-    def OnProto(self, evt) :
-        Prototypical(self, {'type' : 'proto'})
+    def OnProto(self, evt, matrix = None) :
+        self.analyse_matrix(Prototypical, matrix = matrix, analyse_type = 'proto', dlgnb = 3) 
+        #Prototypical(self, {'type' : 'proto'})
+    
+    def OnSplitVar(self, evt, matrix = None):
+        self.analyse_matrix(SplitMatrixFromVar, matrix = matrix, analyse_type = 'splitvar', dlgnb = 3)
+        matrix = self.tree.getmatrix()
+        
 
     def OnSimiTxt(self, evt, corpus = None) :
         #    print 'PLUS DE BUG SUR SIMITXT'
 
     def OnSimiTxt(self, evt, corpus = None) :
         #    print 'PLUS DE BUG SUR SIMITXT'
@@ -868,7 +900,7 @@ Voulez-vous fermer quand même ?"""
             #self.Text = SimiTxt(self)
             if corpus is None :
                 corpus = self.tree.getcorpus()            
             #self.Text = SimiTxt(self)
             if corpus is None :
                 corpus = self.tree.getcorpus()            
-            self.Text = SimiTxt(self, corpus, parametres = {'type': 'simitxt'}, dlg = progressbar(self, 3))
+            self.Text = SimiTxt(self, corpus, parametres = {'type': 'simitxt'}, dlg = 3)
             if self.Text.val == wx.ID_OK :
                 PlaySound(self)
         except :
             if self.Text.val == wx.ID_OK :
                 PlaySound(self)
         except :
@@ -879,14 +911,14 @@ Voulez-vous fermer quand même ?"""
         try :
             if corpus is None :
                 corpus = self.tree.getcorpus()            
         try :
             if corpus is None :
                 corpus = self.tree.getcorpus()            
-            self.Text = WordCloud(self, corpus, parametres = {'type' : 'wordcloud'}, dlg = progressbar(self, 3))
+            self.Text = WordCloud(self, corpus, parametres = {'type' : 'wordcloud'}, dlg = 3)
             if self.Text.val == wx.ID_OK :
                 PlaySound(self)
         except :
             BugReport(self)
 
     def OnClusterCloud(self, corpus, parametres = None) :
             if self.Text.val == wx.ID_OK :
                 PlaySound(self)
         except :
             BugReport(self)
 
     def OnClusterCloud(self, corpus, parametres = None) :
-        self.Text = ClusterCloud(self, corpus, parametres = parametres, dlg = progressbar(self, 3))
+        self.Text = ClusterCloud(self, corpus, parametres = parametres, dlg = 3)
 
     def OnAFCM(self, event):
         try:
 
     def OnAFCM(self, event):
         try:
@@ -899,7 +931,7 @@ Voulez-vous fermer quand même ?"""
         try:
             if corpus is None :
                 corpus = self.tree.getcorpus()
         try:
             if corpus is None :
                 corpus = self.tree.getcorpus()
-            self.Text = Stat(self, corpus, parametres = {'type': 'stat'}, dlg = progressbar(self, 7))
+            self.Text = Stat(self, corpus, parametres = {'type': 'stat'}, dlg = 7)
             
             if self.Text.val == wx.ID_OK :
                 PlaySound(self)
             
             if self.Text.val == wx.ID_OK :
                 PlaySound(self)
@@ -912,7 +944,7 @@ Voulez-vous fermer quand même ?"""
             #print('ATTENTION : PLUS DE BUG SUR LEXICO')
             if corpus is None :
                 corpus = self.tree.getcorpus()
             #print('ATTENTION : PLUS DE BUG SUR LEXICO')
             if corpus is None :
                 corpus = self.tree.getcorpus()
-            self.Text = Lexico(self, corpus, parametres = {'type' : 'spec'}, dlg = progressbar(self, 3))
+            self.Text = Lexico(self, corpus, parametres = {'type' : 'spec'}, dlg = 3)
             if self.Text.val == wx.ID_OK :
                 PlaySound(self)
         except:
             if self.Text.val == wx.ID_OK :
                 PlaySound(self)
         except:
@@ -953,16 +985,18 @@ Voulez-vous fermer quand même ?"""
         ID = evt.GetId()
         if ID == self.ID_splitvar :
             Extract(self, 'splitvar')
         ID = evt.GetId()
         if ID == self.ID_splitvar :
             Extract(self, 'splitvar')
-        else :
+        elif ID == self.ID_extractmod :
             Extract(self, 'mods')
             Extract(self, 'mods')
+        elif ID == self.ID_extractthem :
+            Extract(self, 'them')
 
 
-    def OnTextAlceste(self, event, corpus = None):
+    def OnTextReinert(self, event, corpus = None):
         try:
             #print('ATTENTION : PLUS DE BUG SUR ALCESTE')
             #RunAnalyse(self, corpus, Alceste, OptAlceste)
             if corpus is None :
                 corpus = self.tree.getcorpus()            
         try:
             #print('ATTENTION : PLUS DE BUG SUR ALCESTE')
             #RunAnalyse(self, corpus, Alceste, OptAlceste)
             if corpus is None :
                 corpus = self.tree.getcorpus()            
-            self.Text = Alceste(self, corpus, parametres = {'type': 'alceste'}, dlg = progressbar(self,6))
+            self.Text = Reinert(self, corpus, parametres = {'type': 'alceste'}, dlg = 6)
             if self.Text.val == wx.ID_OK:
                 PlaySound(self)
         except:
             if self.Text.val == wx.ID_OK:
                 PlaySound(self)
         except:
@@ -972,25 +1006,25 @@ Voulez-vous fermer quand même ?"""
         try:
             if corpus is None :
                 corpus = self.tree.getcorpus()
         try:
             if corpus is None :
                 corpus = self.tree.getcorpus()
-            self.Text = AnalysePam(self, corpus, parametres = {'type' : 'pamtxt'}, dlg = progressbar(self,6))
+            self.Text = AnalysePam(self, corpus, parametres = {'type' : 'pamtxt'}, dlg = 6)
             if self.Text.val == wx.ID_OK:
                 PlaySound(self)
         except:
             BugReport(self)
 
     def SimiCluster(self, parametres = {}, fromprof = False, pathout = '', listactives = [], actives = [], tableau = None) :
             if self.Text.val == wx.ID_OK:
                 PlaySound(self)
         except:
             BugReport(self)
 
     def SimiCluster(self, parametres = {}, fromprof = False, pathout = '', listactives = [], actives = [], tableau = None) :
-        DoSimi(self, param = parametres, fromprof =  fromprof, pathout = pathout, listactives = listactives, actives = actives, tableau = tableau)
+        DoSimi(self, param = parametres, fromprof =  fromprof, listactives = listactives, actives = actives, tableau = tableau)
     
     
-    def OnSimi(self,evt):
-        try :
+#    def OnSimi(self,evt):
+#        try :
             #print 'ATTENTION !!!! VERGES'
             #print 'PLUS DE BUG SUR SIMI'
             #print 'ATTENTION !!!! VERGES'
             #print 'PLUS DE BUG SUR SIMI'
-            self.res = DoSimi(self, param = None)
+#            self.res = DoSimi(self, param = None)
             #self.res = Verges(self)
             #self.res = Verges(self)
-            if self.res.val == wx.ID_OK :
-                PlaySound(self)
-        except :
-            BugReport(self)
+#            if self.res.val == wx.ID_OK :
+#                PlaySound(self)
+#        except :
+#            BugReport(self)
 #################################################################
 
     def OnHelp(self, event):
 #################################################################
 
     def OnHelp(self, event):
@@ -1026,9 +1060,14 @@ Voulez-vous fermer quand même ?"""
         if truepath :
             if os.path.splitext(self.filename)[1] in ['.csv', '.xls', '.ods']:
                 self.tableau = Tableau(self, self.filename)
         if truepath :
             if os.path.splitext(self.filename)[1] in ['.csv', '.xls', '.ods']:
                 self.tableau = Tableau(self, self.filename)
-                get_table_param(self, self.filename)
-                self.tableau.make_content()
-                self.tableau.show_tab()
+                val = get_table_param(self, self.filename)
+                if val == wx.ID_OK :
+                    self.tableau.make_content()
+                    OpenAnalyse(self, self.tableau.parametres)
+                    self.tree.OnItemAppend(self.tableau.parametres)
+                #get_table_param(self, self.filename)
+                #self.tableau.make_content()
+                #self.tableau.show_tab()
                 #open_data(self, self.filename)
             elif os.path.splitext(self.filename)[1] == '.txt':
                 self.OpenText()
                 #open_data(self, self.filename)
             elif os.path.splitext(self.filename)[1] == '.txt':
                 self.OpenText()
@@ -1164,7 +1203,10 @@ class MySplashScreen(wx.SplashScreen):
             self.ShowMain()
 
     def ShowMain(self):
             self.ShowMain()
 
     def ShowMain(self):
-        frame = IraFrame(None, -1, "IRaMuTeQ " + ConfigGlob.get('DEFAULT', 'version'), size=(1100, 800))
+        displaySize = wx.DisplaySize()
+        w = displaySize[0]/1.2
+        h = displaySize[1]/1.2
+        frame = IraFrame(None, -1, "IRaMuTeQ " + ConfigGlob.get('DEFAULT', 'version'), size=(w, h))
         frame.Show()
         frame.finish_init()
         frame.Upgrade()
         frame.Show()
         frame.finish_init()
         frame.Upgrade()