Salome HOME
022491: EDF 2249 SMESH: Integration of a small python library for quadrangle meshing
[modules/smesh.git] / src / Tools / Verima / Base / dataBase.py
1 # -*- coding: utf-8 -*-
2
3 import os
4 import datetime
5 import sys
6
7 from PyQt4 import QtSql, QtCore
8 from tableMaillages  import TableMaillages
9 from tableMailleurs  import TableMailleurs
10 from tableMachines   import TableMachines
11 from tableVersions   import TableVersions
12 from tableGroupesRef import TableGroupesRef
13 from tableGroupes    import TableGroupes
14 from tableMailles    import TableMailles
15 from tableTailles    import TableTailles
16 from tableRatios     import TableRatios
17 from tablePerfs      import TablePerfs
18 from Stats.job       import Job
19 from Stats.ref       import Ref
20 from CreeDocuments.jobHtml       import Document
21
22
23 class Base:
24   def __init__(self,file):    
25        self.db  = QtSql.QSqlDatabase.addDatabase("QSQLITE")
26        self.db.setDatabaseName(file)
27        self.db.setHostName("localhost");
28        self.db.setUserName("");
29        self.db.setPassword("")
30        if not self.db.open():
31          print(self.db.lastError().text())
32        else:
33          print "dataBase Open"
34        self.file=file
35         
36   def create(self):
37       self.maTableMailleurs=TableMailleurs()
38       self.maTableMailleurs.createSqlTable()
39       self.maTableMachines=TableMachines()
40       self.maTableMachines.createSqlTable()
41       self.maTableVersions=TableVersions()
42       self.maTableVersions.createSqlTable()
43       self.maTableMaillages=TableMaillages()
44       self.maTableMaillages.createSqlTable()
45       self.maTableGroupesRef=TableGroupesRef()
46       self.maTableGroupesRef.createSqlTable()
47       self.maTablePerfs=TablePerfs()
48       self.maTablePerfs.createSqlTable()
49       self.maTableMailles=TableMailles()
50       self.maTableMailles.createSqlTable()
51       self.maTableTailles=TableTailles()
52       self.maTableTailles.createSqlTable()
53       self.maTableGroupes=TableGroupes()
54       self.maTableGroupes.createSqlTable()
55       self.maTableRatios=TableRatios()
56       self.maTableRatios.createSqlTable()
57     
58   def initialise(self):
59       self.maTableMaillages=TableMaillages()
60       self.maTableMailleurs=TableMailleurs()
61       self.maTableVersions=TableVersions()
62       self.maTableMachines=TableMachines()
63       self.maTableMailles=TableMailles()
64       self.maTableTailles=TableTailles()
65       self.maTableGroupes=TableGroupes()
66       self.maTableGroupesRef=TableGroupesRef()
67       self.maTablePerfs=TablePerfs()
68       self.maTableRatios=TableRatios()
69  
70   def remplit(self):
71       self.maTableMailleurs.remplit()
72       self.maTableMaillages.remplit()
73       self.maTableVersions.remplit()
74       #self.maTableVersions.creeVersion()
75       self.maTableMachines.creeMachine()
76       self.maTableGroupesRef.remplit()
77
78   def close(self):
79        self.db.close()
80        
81   def exportToCSV(self,partiel):
82       aujourdhui=datetime.date.today()
83       monFolder="ExportDB"+str(aujourdhui)
84       try :
85         os.mkdir(monFolder)
86       except :
87         pass
88       self.maTableMachines.exportToCSV()
89       self.maTableMailles.exportToCSV()
90       self.maTableTailles.exportToCSV()
91       self.maTableGroupes.exportToCSV()
92       self.maTablePerfs.exportToCSV()
93       self.maTableRatios.exportToCSV()
94       if partiel==True: return
95       self.maTableMailleurs.exportToCSV()
96       self.maTableVersions.exportToCSV()
97       self.maTableMaillages.exportToCSV()
98       self.maTableMachines.exportToCSV()
99       self.maTableGroupesRef.exportToCSV()
100
101   def importFromCSV(self,folder,partiel,force):
102       if partiel==False: 
103          self.maTableMailleurs.importFromCSV(folder,force)
104          self.maTableVersions.importFromCSV(folder,force)
105          self.maTableMaillages.importFromCSV(folder,force)
106          self.maTableGroupesRef.importFromCSV(folder,force)
107          self.maTableMachines.importFromCSV(folder,force)
108       self.maTableMailles.importFromCSV(folder,force)
109       self.maTableGroupes.importFromCSV(folder,force)
110       self.maTablePerfs.importFromCSV(folder,force)
111       self.maTableRatios.importFromCSV(folder,force)
112       self.maTableGroupesRef.importFromCSV(folder,force)
113
114   def Structure(self):
115       # jamais appelee. juste pour memoire
116       texteQuery='select * from sqlite_master;'
117       maQuery=QSqlQuery()
118       return maQuery.exec_(texteQuery)
119
120   def passeJobs(self,all,salomePath,version,force,listeMaillage):
121       if all==True: paramMaillage=self.maTableMaillages.construitListeMaillages()
122       else        : paramMaillage=self.maTableMaillages.verifieListeMaillages(listeMaillage)
123       # paramMaillage=(( id, script, fichier med),)
124
125       #version="Salome7.3"
126       bOk,versionId,versionName = self.maTableVersions.chercheVersion(version)
127       if bOk==False:
128          self.maTableVersions.creeVersion(version)
129          print "nouvelle Version enregistree dans la base"
130          bOk,versionId,versionName = self.maTableVersions.chercheVersion(version)
131          if bOk==False:
132             print "Impossible de creer la version"
133             return
134
135       bOk,nomMachine = self.maTableMachines.chercheMachine()
136       if bOk==False:
137          self.maTableMachines.creeMachine()
138          print "enregistrement de la machine dans la table des machines"
139          bOk,nomMachine = self.maTableMachines.chercheMachine()
140          if bOk==False:
141             print "Impossible de creer la version"
142             return
143
144
145       for params in paramMaillage:
146         
147          print "___________________________________________"
148          print ""
149          print " Job : ", params[1]
150          print " Version de salome : ", versionName 
151
152          #recherche si le Job a deja ete passe
153          if self.maTablePerfs.getVal(params[0],versionId,nomMachine) !=None and force==False:
154             print "job numero: " , params[0], "deja passe"
155             print ""
156             print "___________________________________________"
157             continue
158
159          # recherche de la reference du Job
160          maRef=Ref(self,params[0],versionId,nomMachine)
161          idVersionRef=self.maTableVersions.getVersionRef()
162          idJob=params[0]
163          if maRef.existe==False and idVersionRef != versionId :
164             print "pas de reference pour le job : ", params[0]
165             print "pas de passage du job", 
166             continue
167
168
169          mesGroupesRef=self.maTableGroupesRef.getVals(idJob)
170          fichierGroupesRef=str(params[2]).replace('.med','_groupesRef.res')
171          from Stats.utiles import writeFile
172          writeFile(fichierGroupesRef,",".join(mesGroupesRef))
173          monjob=Job(params,salomePath,versionId,nomMachine,mesGroupesRef)
174          print ""
175          print "  Debut d execution"
176          monjob.execute()
177       
178          # remplit Perfs
179          self.maTablePerfs.insereOuRemplaceLigne((idJob,versionId,nomMachine,int(monjob.getCPU()),0),False)
180          if idVersionRef != versionId :
181             stop=maRef.verifieCpu(monjob.getCPU())
182             if stop :
183                print "                   Arret                "
184                print " Pb CPU: Seuil Atteint sur job : ", params[0]
185                print "________________________________________"
186
187          # remplit la table Mailles
188          listeColonnes,listeValues=monjob.getStatSurMailles()
189          print listeColonnes,listeValues
190          i=0
191          for col in listeColonnes :
192             lVal=[idJob,versionId,nomMachine,col]+[listeValues[i]]
193             lVal=tuple(lVal)
194             if str(listeValues[i]) != str(0): self.maTableMailles.insereOuRemplaceLigne(lVal,False)
195             i+=1
196          if idVersionRef != versionId :
197             stop=maRef.verifieMailles(listeValues,listeColonnes)
198             if stop :
199                print "                   Arret                "
200                print " Pb sur le nombre de Maille : Seuil Atteint sur job : ", params[0]
201                print "_________________________________________________________________"
202                #exit()
203             else :
204                print "verification du Nb de Mailles effectuee"
205
206          # remplit la table Tailles
207          listeValues=monjob.getStatSurTailles()
208          lVal=[params[0],versionId,nomMachine]+listeValues
209          self.maTableTailles.insereOuRemplaceLigne(tuple(lVal),False)
210          if idVersionRef != versionId :
211             stop=maRef.verifieTailles(lVal)
212             if stop :
213                print "                   Arret                "
214                print " Pb sur la taille des mailles : Seuil Atteint sur job : ", params[0]
215                print "_________________________________________________________________"
216                #exit()
217             else :
218                print "verification du Nb de Mailles effectuee"
219
220
221          # remplit la table Ratio
222          maDim=self.maTableMaillages.getVal(params[0],'dimension')
223          if maDim == 3 :
224             listeValues=monjob.getStatSurRatios()
225             lVal=[params[0],versionId,nomMachine]+listeValues
226             self.maTableRatios.insereOuRemplaceLigne(tuple(lVal),False)
227             if idVersionRef != versionId :
228                stop=maRef.verifieRatios(lVal)
229                if stop :
230                   print "                   Arret                "
231                   print " Pb sur la taille des mailles : Seuil Atteint sur job : ", params[0]
232                   print "_________________________________________________________________"
233                   #exit()
234                else :
235                   print "verification du Nb de Mailles effectuee"
236
237          # remplit les Groupes
238          for groupe in mesGroupesRef:
239              listeColonnes,listeValues=monjob.getStatSurGroupes(groupe)
240              i=0
241              for col in listeColonnes :
242                 lVal=[groupe,params[0],versionId,nomMachine,col]+[listeValues[i]]
243                 lVal=tuple(lVal)
244                 if str(listeValues[i]) != str(0): self.maTableGroupes.insereOuRemplaceLigne(lVal,False)
245                 i=i+1
246              if idVersionRef != versionId :
247                 stop=maRef.verifieMaillesPourGroupes(groupe,listeValues,listeColonnes)
248                 stop=0
249                 if stop :
250                    print "                   Arret                "
251                    print " Pb sur le nombre de Maille : Seuil Atteint sur job : ", params[0]
252                    print "_________________________________________________________________"
253                    #exit()
254          print "verification du Nb de Mailles sur les groupes reference effectuee"
255          print "_________________________________________________________________"
256
257   
258   def compare(self,version,versionRef,fichier):    
259       print "_________________________________________________________________"
260       print "Generation du rapport de comparaison" 
261       bOk,versionId,versionName = self.maTableVersions.chercheVersion(version)
262       if bOk==False :
263          print "version ", version , " inconnue dans la base"
264          exit()
265       print "Version a comparer : ", versionName
266       versionCompName=versionName
267       versionCompId=versionId
268
269       if versionRef==None:
270          idVersionRef=self.maTableVersions.getVersionRef()
271       bOk,versionId,versionName = self.maTableVersions.chercheVersion(idVersionRef)
272       if bOk==False :
273          print "version de référence ", versionRef , " inconnue dans la base"
274       versionRefName=versionName
275       versionRefId=versionId
276       print "Version de comparaison : ", versionRefName
277
278       bOk,nomMachine = self.maTableMachines.chercheMachine()
279       monDocument=Document()
280       monDocument.initEntete(versionName, versionRefName,nomMachine)
281       mailleursIdListe,mailleursNameListe=self.maTableMailleurs.getTous()
282       
283       allEntitySurMaille=self.maTableMailles.getAllEntity()
284       allEntitySurGroupe=self.maTableGroupes.getAllEntity()
285       # Boucle sur les mailleurs
286       for indexMailleur in range(len(mailleursNameListe)):
287           monDocument.initMailleur(mailleursNameListe[indexMailleur]) 
288           l1,l2,l3,l4,l5,l6=self.maTableMaillages.getTousPourMaillage(mailleursIdListe[indexMailleur])
289           maillagesIdListe=l1
290           maillagesNameListe=l2
291           maillagesSeuilCPUListe=l3
292           maillagesSeuilRatioListe=l4
293           maillagesSeuilTailleListe=l5
294           maillagesSeuilNbMailleListe=l6
295           dicoMaillage={}
296       #   Boucle sur les maillages 
297           for indexMaillage in range(len(maillagesNameListe)):
298              idMaillage=maillagesIdListe[indexMaillage]
299              dicoMaillage["NOM"]=maillagesNameListe[indexMaillage]
300              dicoMaillage["NBCPU"]=self.maTablePerfs.getVal(idMaillage,versionCompId,nomMachine)
301              dicoMaillage["REFCPU"]=self.maTablePerfs.getVal(idMaillage,versionRefId,nomMachine)
302              dicoMaillage["DIFCPU"],dicoMaillage["DIFREL"],dicoMaillage["WARNING"]=self.calculDiffCPU(dicoMaillage["NBCPU"],dicoMaillage["REFCPU"],maillagesSeuilCPUListe[indexMaillage])
303   
304              dicoMaillage["RMAX"]=self.maTableRatios.getVal(idMaillage,versionCompId,nomMachine,'RatioMax')
305              dicoMaillage["RMAXREF"]=self.maTableRatios.getVal(idMaillage,versionRefId,nomMachine,'RatioMax')
306              dicoMaillage["RMIN"]=self.maTableRatios.getVal(idMaillage,versionCompId,nomMachine,'RatioMin')
307              dicoMaillage["RMINREF"]=self.maTableRatios.getVal(idMaillage,versionRefId,nomMachine,'RatioMin')
308              dicoMaillage["RMOY"]=self.maTableRatios.getVal(idMaillage,versionCompId,nomMachine,'Moyenne')
309              dicoMaillage["RMOYREF"]=self.maTableRatios.getVal(idMaillage,versionRefId,nomMachine,'Moyenne')
310              dicoMaillage["R1Q"]=self.maTableRatios.getVal(idMaillage,versionCompId,nomMachine,'Q1')
311              dicoMaillage["R1QREF"]=self.maTableRatios.getVal(idMaillage,versionRefId,nomMachine,'Q1')
312              dicoMaillage["RMED"]=self.maTableRatios.getVal(idMaillage,versionCompId,nomMachine,'Mediane')
313              dicoMaillage["RMEDREF"]=self.maTableRatios.getVal(idMaillage,versionRefId,nomMachine,'Mediane')
314              dicoMaillage["R3Q"]=self.maTableRatios.getVal(idMaillage,versionCompId,nomMachine,'Q3')
315              dicoMaillage["R3QREF"]=self.maTableRatios.getVal(idMaillage,versionRefId,nomMachine,'Q3')
316   
317              dicoMaillage["TMAX"]=self.maTableTailles.getVal(idMaillage,versionCompId,nomMachine,'TailleMax')
318              dicoMaillage["TMAXREF"]=self.maTableTailles.getVal(idMaillage,versionRefId,nomMachine,'TailleMax')
319              dicoMaillage["TMIN"]=self.maTableTailles.getVal(idMaillage,versionCompId,nomMachine,'TailleMin')
320              dicoMaillage["TMINREF"]=self.maTableTailles.getVal(idMaillage,versionRefId,nomMachine,'TailleMin')
321              dicoMaillage["TMOY"]=self.maTableTailles.getVal(idMaillage,versionCompId,nomMachine,'Moyenne')
322              dicoMaillage["TMOYREF"]=self.maTableTailles.getVal(idMaillage,versionRefId,nomMachine,'Moyenne')
323              dicoMaillage["T1Q"]=self.maTableTailles.getVal(idMaillage,versionCompId,nomMachine,'Q1')
324              dicoMaillage["T1QREF"]=self.maTableTailles.getVal(idMaillage,versionRefId,nomMachine,'Q1')
325              dicoMaillage["TMED"]=self.maTableTailles.getVal(idMaillage,versionCompId,nomMachine,'Mediane')
326              dicoMaillage["TMEDREF"]=self.maTableTailles.getVal(idMaillage,versionRefId,nomMachine,'Mediane')
327              dicoMaillage["T3Q"]=self.maTableTailles.getVal(idMaillage,versionCompId,nomMachine,'Q3')
328              dicoMaillage["T3QREF"]=self.maTableTailles.getVal(idMaillage,versionRefId,nomMachine,'Q3')
329
330              monDocument.initJob(dicoMaillage)
331
332              i=0
333              dico={}
334              dico["TITRE"]="Nombre de Mailles dans le maillage entier"
335              for nomColonne in allEntitySurMaille:
336                  val=self.maTableMailles.getVal(idMaillage,versionCompId,nomMachine,nomColonne)
337                  valRef=self.maTableMailles.getVal(idMaillage,versionRefId,nomMachine,nomColonne)
338                  if val==0 and valRef==0 : continue
339                  i=i+1
340                  #print nomColonne;print val; print valRef
341                  cMAIL="MAIL"+str(i); cREF="REF"+str(i)
342                  cNB="NB"+str(i); cDIF="DIF"+str(i); cREL="REL"+str(i)
343                  cWARN="WARN"+str(i);
344                  dico[cMAIL]=nomColonne
345                  dico[cREF]=valRef
346                  dico[cNB]=val
347                  dico[cDIF],dico[cREL],dico[cWARN]=self.calculDiff(val,valRef,maillagesSeuilNbMailleListe[indexMaillage])
348              monDocument.initMaille(dico,i)
349
350              # Boucle sur les groupes du maillage
351              mesGroupesRef=self.maTableGroupesRef.getVals(idMaillage)
352              if mesGroupesRef==[] : monDocument.addNoGroup()
353              for groupeId in mesGroupesRef:
354                  i=0
355                  dico={}
356                  dico["TITRE"]="Nombre de Mailles dans le groupe "+groupeId
357                  for nomColonne in allEntitySurGroupe:
358                      val=self.maTableGroupes.getVal(groupeId,idMaillage,versionCompId,nomMachine,nomColonne)
359                      valRef=self.maTableGroupes.getVal(groupeId,idMaillage,versionRefId,nomMachine,nomColonne)
360                      if val==0 and valRef==0 : continue
361                      i=i+1
362                      cMAIL="MAIL"+str(i); cREF="REF"+str(i)
363                      cNB="NB"+str(i); cDIF="DIF"+str(i); cREL="REL"+str(i)
364                      cWARN="WARN"+str(i);
365                      #print nomColonne," ",val," ",valRef
366                      dico[cMAIL]=nomColonne
367                      dico[cREF]=valRef
368                      dico[cNB]=val
369                      dico[cDIF],dico[cREL],dico[cWARN]=self.calculDiff(val,valRef,maillagesSeuilNbMailleListe[indexMaillage])
370                  monDocument.initMaille(dico,i)
371
372       monDocument.creeDocument(fichier)
373
374   def calculDiffCPU(self,nb,nbRef,seuil):    
375          # different de calculDiff : si on est inferieur a la reference
376          # on n a pas de warning
377          diff=nb-nbRef
378          diffRel=((nb-nbRef)*100)/(nbRef*1.00)
379          if diffRel > seuil :
380             warning="plus de "+ str(seuil) + "% de difference CPU"
381          else :
382             warning=""
383          diffRelStr=str(diffRel)+"%"
384          return diff,diffRelStr,warning
385          
386   def calculDiff(self,nb,nbRef,seuil):    
387          diff=nb-nbRef
388          diffRel=((nb-nbRef)*100)/(nbRef*1.00)
389          if diffRel > seuil or (-1*diffRel) > seuil  :
390             warning="difference superieure a "+ str(seuil) + "%"
391          else :
392             warning=""
393          diffRelStr=str(diffRel)+"%"
394          return diff,diffRelStr,warning
395