示例#1
0
    def run(self):
      self.running = True
      
      try:
        import pydevd
        pydevd.connected = True
        pydevd.settrace(suspend=False)
      except:
        # do nothing, since error message only indicates we are not in debug mode
        pass
            
      workdir=os.getcwd()
      encoding = sys.getfilesystemencoding()
      dir1 = self.dir1
      files1 = os.listdir(dir1)
      
      modelName1 = []
      fileName1 = []
      
      ## list for counting the number of result files compared with baseline resultfiles
      listdirfilecounts=[]
      
      ## count variables to calculate the result files of baseline and listdirectories
      dir1filessize=0
      listdirsfilessize=0
      
      for fileName in files1:
          splits = fileName.rsplit('.', 1)
          #print splits
          if len(splits) > 1:
              if splits[1] in SimulationResult.fileExtension:
                   modelName1.append(splits[0])
                   fileName1.append(fileName)
                   fp = os.path.join(dir1, fileName)
                   dir1filessize += int(os.path.getsize(fp))      
      
      size=dir1filessize/(1024*1024.0)
      basedirfilessizes=round(size,1)
      
      if (len(fileName1)!=0): 
          
          subdir=self.logDir          

          ## clear the content of regression report directory if already exists
          if os.path.exists(subdir):
              files = os.listdir(subdir)
              for file in files:
                 fileobj = os.path.join(subdir, file)
                 if(os.path.isfile(fileobj)):
                     os.remove(fileobj)
                 else:
                    shutil.rmtree(fileobj)
                            
          ### create a RegressionReport Directory in the current working directory ###
          if not os.path.exists(subdir): 
              os.mkdir(subdir)
                
          ### copy the dygraph script from /Plugins/Analysis/Testing/ to the result directory ###      
          dygraphpath=os.path.join(self.PySimulatorPath, 'Plugins/Analysis/Testing/dygraph-combined.js').replace('\\','/')
          if os.path.exists(dygraphpath):     
              shutil.copy(dygraphpath,self.logDir)
                                 
          listdirs=self.listdirs
          
          ## create a temp file for writing results and use it later to generate the regression report
          self.logFile=os.path.join(self.logDir, "index.log").replace('\\','/')
          
          fileOut = open(self.logFile, 'w')
          startTime = time.time()
          for dircount in xrange(len(listdirs)):
            dir2=listdirs[dircount]                               
            files2 = os.listdir(dir2)
            
            modelName2 = []
            fileName2 = []
            for fileName in files2:
                splits = fileName.rsplit('.', 1)
                if len(splits) > 1:
                    if splits[1] in SimulationResult.fileExtension:
                        modelName2.append(splits[0])
                        fileName2.append(fileName) 
                        
            '''create a html result file '''
            filename,fileExtension = os.path.splitext(self.logFile)
            logfile1=self.logFile.replace(fileExtension,'.html')                
            fileOuthtml= open(logfile1,'w')
               
            fileOut.write('Output file from comparison of list of simulation results within PySimulator\n')
            fileOut.write('  directory 1 (reference) : ' + dir1.encode(encoding) + '\n')
            fileOut.write('  directory 2 (comparison): ' + dir2.encode(encoding) + '\n')

            for index, name in enumerate(modelName1):            
                if self.stopRequest:
                    fileOut.write("Analysis canceled.")
                    fileOut.close()
                    print "... Comparing result files canceled."
                    self.running = False
                    return

                fileOut.write('\nCompare results from\n')            
                fileOut.write('  Directory 1: ' + fileName1[index].encode(encoding) + '\n')  # Print name of file1
                print "\nCompare results from "
                print "  Directory 1: " + fileName1[index].encode(encoding)

                try:
                    i = modelName2.index(name)
                except:
                    fileOut.write('  Directory 2: NO equivalent found\n')
                    print '  Directory 2: NO equivalent found'
                    ### codes to handle empty directory list in comparing results
                    model1 = Simulator.SimulatorBase.Model(None, None, None)
                    filepath = dir1 + '/' + fileName1[index]
                    model1.loadResultFile(filepath)
                    var = model1.integrationResults.getVariables()
                    message1= '<a href >' + fileName1[index].encode(encoding).replace('.mat','') +'-'+str(len(var))+'</a>' +' </td>'
                    emptyhref= "Not-Found"
                    s = '\n'.join(['<tr>','<td id=2>',message1,'<td id=2 bgcolor=#FFFFFF align="center">',emptyhref,'</td>','</tr>']) 
                    fileOuthtml.write(s)
                    fileOuthtml.write('\n')
                    i = -1
                if i >= 0:
                    fileOut.write('  Directory 2: ' + fileName2[i].encode(encoding) + '\n')  # Print name of file2
                    print "  Directory 2: " + fileName2[i].encode(encoding)
                    file1 = dir1 + '/' + fileName1[index]
                    file2 = dir2 + '/' + fileName2[i]
                    
                    ## calculate the filesize of the comparing directory result files
                    listdirsfilessize += int(os.path.getsize(file2))      
                    listdirfilecounts.append(file2)
                    
                    model1 = Simulator.SimulatorBase.Model(None, None, None)
                    model1.loadResultFile(file1)
                    model2 = Simulator.SimulatorBase.Model(None, None, None)
                    model2.loadResultFile(file2)
                    compareResults(model1, model2, dircount, self.tol, fileOut, fileOuthtml,self.logFile,file2,file1)
            
            fileOut.write('\n')    
            fileOut.write("******* Compare Analysis Completed   *******" + u"\n")
            fileOut.write('\n')                   
            fileOuthtml.close()
            green=[]
            red=[]
            
            '''open the html file to insert start html tags and add add headers of the directory name'''
            with open(logfile1) as myfile:
               htmldata=myfile.read()          
               m1="<table><tr><th id=0>Model</th><th id=0>"+os.path.basename(dir2)+'</th>'+'</tr>'
               soup = BeautifulSoup(open(logfile1))
               data=soup.find_all('td',{"bgcolor":["#00FF00","#FF0000"]})         
               for i in xrange(len(data)):
                  x=BeautifulSoup(str(data[i]))
                  tag=x.td
                  checkcolor=tag['bgcolor']
                  if(checkcolor=="#00FF00"):
                       green.append(checkcolor)
                  else:
                       red.append(checkcolor)

               message='\n'.join(['<html>',m1])
               f=open(logfile1,'w')
               if (len(green)==0 and len(red)==0): 
                 colorpercent=0
               else:
                 colorpercent=int((len(green))*100/(len(green)+len(red)))
                 
               if (colorpercent==100):
                   m1='<tr><td></td><td id=1 bgcolor="#00FF00" align="center">'+ str(len(green))+' passed'+' / '+str(len(red))+' failed'+'</td></tr>'
                   #percentage=str((len(green))*100/(len(green)+len(red)))+'%'+' passed'
                   percentage=str(colorpercent)+'%'+' passed'
                   m2='<tr><td></td><td id=100 bgcolor="#00FF00" align="center">'+percentage+'</td></tr>'
                   m3='\n'.join([message,m1,m2,htmldata,'</table>','</html>'])
                   f.write(m3)
                   f.write('\n')
               if(colorpercent>=51 and colorpercent<=99):
                   m1='<tr><td></td><td id=1 bgcolor="#FFA500" align="center">'+ str(len(green))+' passed'+' / '+str(len(red))+' failed'+'</td></tr>'
                   #percentage=str((len(green))*100/(len(green)+len(red)))+'%'+' passed'
                   percentage=str(colorpercent)+'%'+' passed'
                   m2='<tr><td></td><td id=100 bgcolor="#FFA500" align="center">'+percentage+'</td></tr>'
                   m3='\n'.join([message,m1,m2,htmldata,'</table>','</html>'])
                   f.write(m3)
                   f.write('\n')
               if(colorpercent<=50):
                   m1='<tr><td></td><td id=1 bgcolor="#FF0000" align="center">'+ str(len(green))+' passed'+' / '+str(len(red))+' failed'+'</td></tr>'
                   #percentage=str((len(green))*100/(len(green)+len(red)))+'%'+' passed'
                   percentage=str(colorpercent)+'%'+' passed'
                   m2='<tr><td></td><td id=100 bgcolor="#FF0000" align="center">'+percentage+'</td></tr>'
                   m3='\n'.join([message,m1,m2,htmldata,'</table>','</html>'])
                   f.write(m3)
                   f.write('\n')
               f.close()
           
            '''Save the data to prepare regression report'''
            
            newpath=os.path.dirname(logfile1)
            name=os.path.basename(logfile1)
            newname=''.join([str(dircount),'_',name])
            np1=os.path.join(newpath,'rfiles').replace('\\','/')
            np2=os.path.join(np1,newname).replace('\\','/')
            
            #create a new directory to store the result files for each run, to make parsing easy when user asks for regression chart 
            if not os.path.exists(np1): 
               os.mkdir(np1)
            shutil.copy(logfile1,np2)
                      
          print "... running the analysis done."
          ## final calculation of listdirfiles result size
          size1=listdirsfilessize/(1024*1024.0)
          Totallistdirfilessizes=round(size1,1)   
          
          elapsedTime = time.time() - startTime
          fileOut.close()
          totaldirfilescount=len(listdirfilecounts)
          basefilecount=len(fileName1)
          resultdirsize=basedirfilessizes+Totallistdirfilessizes
          Reporting.genregressionreport(self.logFile,totaldirfilescount,basefilecount,elapsedTime,resultdirsize,dir1,self.tol)
          
          ## remove the temporary rfiles directory after the Regression report generated          
          regressionfilesdir=os.path.join(os.path.dirname(self.logFile),'rfiles').replace('\\','/')
          if os.path.exists(regressionfilesdir): 
              shutil.rmtree(regressionfilesdir)
              
          ## change the directory to workdir after regression report
          os.chdir(workdir)
      else:
          print "No files to be compared found."
          print "... running the analysis done."
      
      self.running = False
示例#2
0
    def run(self):
      self.running = True
      workdir=os.getcwd()
      files1 = os.listdir(self.dir1)
      
      dir1filessize=0
      ComparablefileName = []
      for fileName in files1:
         splits = fileName.rsplit('.', 1)
         if len(splits) > 1:
            if splits[1] in SimulationResult.fileExtension:
               ComparablefileName.append(fileName)
               fp = os.path.join(self.dir1, fileName)
               dir1filessize += int(os.path.getsize(fp))      
      
      size=dir1filessize/(1024*1024.0)
      basedirfilessizes=round(size,1)
      
      if(len(ComparablefileName)!=0):      
          subdir=self.logDir    
          
          ## clear the contents of regression report directory if already exists
          if os.path.exists(subdir): 
               files = os.listdir(subdir)
               for file in files:
                  fileobj = os.path.join(subdir, file)
                  if(os.path.isfile(fileobj)):
                      os.remove(fileobj)
                  else:
                      shutil.rmtree(fileobj)
              
          ###  create a RegressionReport Directory in the current working directory ###
          if not os.path.exists(subdir): 
                os.mkdir(subdir)
          
          ### copy the dygraph script from /Plugins/Analysis/Testing/ to the result directory ###      
          dygraphpath=os.path.join(self.PySimulatorPath, 'Plugins/Analysis/Testing/dygraph-combined.js').replace('\\','/')
          if os.path.exists(dygraphpath):     
              shutil.copy(dygraphpath,self.logDir)
          
          ## create a temp file for writing results and use it later to generate the regression report
          self.logFile=os.path.join(self.logDir,'index.log').replace('\\','/')

          logfiles=[]   
          list1dir=[]
          tolerance=[]      
          dir1 = self.dir1
          listdirs=self.listdirs 
          list1dir.append(dir1)
          tolerance.append(self.tol)
          
          listdir1= list1dir*len(listdirs)
          logfiles.append(self.logFile)
          logfiles1=logfiles*len(listdirs)
          tol=tolerance*len(listdirs)
             
          ## create a login directory for logging multiprocessing output from terminal to a file 
          logdir =os.path.join(os.getcwd(),'loginentries').replace('\\','/')
          if not os.path.exists(logdir):
              os.mkdir(logdir)

          processlog=[]
          dircount=[]
          resultfiles=[]      
          for i in xrange(len(logfiles1)):
              dir_name=os.path.dirname(logfiles1[i])
              filename=os.path.basename(logfiles1[i])
              newlogfile=str(i)+'_'+filename
              newlogfilepath=os.path.join(dir_name,newlogfile).replace('\\','/')
              processlogfilepath=os.path.join(logdir,newlogfile).replace('\\','/')
              resultfiles.append(newlogfilepath)
              processlog.append(processlogfilepath)
              dircount.append(i)
          
          ## Create a Pool of process and run the Compare Analysis in Parallel
          pool=Pool()
          startTime = time.time() 
          val=pool.map(ParallelCompareAnalysis, zip(listdir1,listdirs,resultfiles,dircount,tol,processlog))
          pool.close()
          pool.join()
          elapsedTime = time.time() - startTime
          #print elapsedTime
          ''' print the output to GUI after process completed '''
          for i in xrange(len(processlog)):
             f=open(processlog[i],'r')
             processlogentries=f.read()
             print processlogentries
             f.close()

          shutil.rmtree(logdir)
          print "Parallel Compare Analysis Completed"
         
          ## calculate the totalfiles compared and size of result files
          calspace=[]
          calfiles=[]
          for z in xrange(len(val)):
               calspace.append(val[z][0])
               calfiles.append(len(val[z][1]))
               
          size1=sum(calspace)/(1024*1024.0)
          Totallistdirfilessizes=round(size1,1)
          
          totaldirfilescount=sum(calfiles)
          basefilecount=len(ComparablefileName)
          resultdirsize=basedirfilessizes+Totallistdirfilessizes
          Reporting.genlogfilesreport(self.logFile)
          Reporting.genregressionreport(self.logFile,totaldirfilescount,basefilecount,elapsedTime,resultdirsize,dir1,self.tol)      
          
          ## Remove the temporary logfiles and rfiles directories after the regression report completed
          logfilesdir=os.path.join(os.path.dirname(self.logFile),'logfiles').replace('\\','/')
          if os.path.exists(logfilesdir): 
             shutil.rmtree(logfilesdir)
                   
          regressionfilesdir=os.path.join(os.path.dirname(self.logFile),'rfiles').replace('\\','/')
          if os.path.exists(regressionfilesdir): 
             shutil.rmtree(regressionfilesdir)
             
          ## change the directory to workdir after regression report
          os.chdir(workdir)     
      else:
          print "No files to be compared found."
          print "Parallel Compare Analysis Completed"
      
      self.running = False