Mercurial > hg > multiomr
diff Automatism/BatchOMR.py @ 2:46fb79167a61 tip
Main Code
author | Victor Padilla <victor.padilla.mc@gmail.com> |
---|---|
date | Mon, 04 May 2015 22:56:18 +0200 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Automatism/BatchOMR.py Mon May 04 22:56:18 2015 +0200 @@ -0,0 +1,230 @@ +''' +Created on 10/11/2014 + +@organization: Lancaster University & University of Leeds +@version: 1.0 +Created on 11/12/2014 + +@author: Victor Padilla +@contact: v.padilla@lancaster.ac.uk + +Functions related to SIKULI automatism +''' +import logging +import os +import sys +from subprocess import Popen +import shutil +from music21 import converter +from Functions import FilesFunctions + + + +class BatchOMR: + ''' + Class for the SIKULI process + ''' + ################################################## + # @param idOMR It can be "SE" "SS" "CP" "PS" "ALL" + # @param dirName folder where the images are and .xml will be + # @param files array with tiff files + def Batch(self,idOMR,dirName,files): + ''' + Runs the SIKULI process. + - idOMR: SE, SS, CP, PS + - if exists, skip + - it takes all the .tif files and convert them to SE.xml, SS.xml, CP.xml or PS.xml + - it waits until the process is finished + + usage: + ff=FilesFunctions() + dirName="C:\\Users\\victor\\Desktop\\data" + files= ff.getAllImgFiles(dirName) + batchOMR=BatchOMR() + batchOMR.Batch("PS",dirName,files) + ''' + + print "Processing...",dirName+"/"+idOMR+".xml" + if os.path.exists(dirName+"/"+idOMR+".xml"): + print "....Completed ",dirName+"/"+idOMR+".xml" + return + rootApp=os.path.dirname(sys.argv[0]) + rootApp=rootApp.replace("\\","/") + print rootApp + strFiles="" + for f in files: + strFiles=strFiles+" \""+f+"\"" + print dirName,strFiles + + dirName=dirName.replace("\\","/") + dirName="\""+dirName+"/\"" + + cwd=rootApp+"/sikuli1.0.1/runScript.cmd -r "+rootApp+"/sikuli/"+idOMR+".sikuli --args " + cwd=cwd+dirName+strFiles + print cwd + p = Popen(cwd) + p.wait() + p.communicate() + print "....Completed ",dirName+"/"+idOMR+".xml" + + + ############################################### + # @param rootDir root process folder + def cleanXMLFiles(self,rootDir): + ''' + Removes all the .xml files and .mro files in the tree folder + It is used for testing mainly + + usage: + + batchOMR=BatchOMR() + batchOMR.cleanXMLFiles("C:\\Users\\victor\\Desktop\\data") + ''' + for outWalk in os.walk(rootDir): + dirName=outWalk[0] + fileList=outWalk[2] + for myfile in fileList: + if myfile.endswith('.xml'): + os.remove(dirName+"/"+myfile) + print myfile + if myfile.endswith('.mro'): + os.remove(dirName+"/"+myfile) + print myfile + + + ############################################### + # @param rootDir root process folder + # @param idOMR can be "PS" "CP" "SE" "SS" "ALL" + def processAllTiffFiles(self,rootDir,idOMR): + ''' + Runs the complete process for the tree folder + idOMR can be: + PS + CP + SE + SS + ALL (run all the OMRs). Capella is removed for many problems associated + + usage: + + batchOMR=BatchOMR() + batchOMR.processAllTiffFiles("C:\\Users\\victor\\Desktop\\data","SE") + ''' + print rootDir + logging.basicConfig(filename=rootDir+'\\BigDataLogs.log',format='%(asctime)s %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p') + for outWalk in os.walk(rootDir): + dirName=outWalk[0] + print('Found directory: %s' % dirName) + ff=FilesFunctions() + files= ff.getAllImgFiles(dirName) + if len(files)>0: + logging.warning(idOMR+" "+dirName) + if idOMR=="PS": + self.Batch("PS",dirName,files) + if idOMR=="SE": + self.Batch("SE",dirName,files) + if idOMR=="SS": + self.Batch("SS",dirName,files) + if idOMR=="CP": + self.Batch("CP",dirName,files) + if idOMR=="ALL": + # logging.warning("CP: "+dirName) + # Batch("CP",dirName,files) + logging.warning("PS: "+dirName) + self.Batch("PS",dirName,files) + logging.warning("SE: "+dirName) + self.Batch("SE",dirName,files) + logging.warning("SS: "+dirName) + self.Batch("SS",dirName,files) + + + ############################################### + # @param rootDir root process folder + def setupApp(self,rootDir): + ''' + Configures the main folder to process the data + Creates the "Process" close to "OMRS" folder and copy the .xml files. + - the parts files in "part/XML" folder with the structure: + - idpart.version.omrId.xml + - the full scores in fullScore/XML" folder with the structure: + - FS.version.omrId.xml + usage: + batchOMR=BatchOMR() + batchOMR.setupApp("C:\\Users\\victor\\Desktop\\data") + ''' + ff=FilesFunctions() + ################ + # FOR PARTS #### + ################ + for outWalk in os.walk(rootDir): + dirName=outWalk[0] + subdirList=outWalk[1] + if "OMRS" in subdirList: + rootScore=dirName + if(dirName.upper().find("\\OMRS\\")!=-1 and dirName.upper().find("\\XML")!=-1 and dirName.upper().find("\\PARTS")!=-1): + arrDir=dirName.split("\\") + idpart=arrDir[len(arrDir)-2] + version=arrDir[len(arrDir)-3] + idmovement=arrDir[len(arrDir)-5] + files= ff.getAllXMLFiles(dirName) + myfolder=rootScore+"\\Process\\"+idmovement+"\\parts\\"+idpart+"\\XML\\" + if not os.path.exists(myfolder): + os.makedirs(myfolder) + for f in files: + if not os.path.isfile(myfolder+idpart+"."+version+"."+f): + shutil.copy2(dirName+"\\"+f, myfolder+idpart+"."+version+"."+f) + + ########################### + # FOR FULL SCORE ########## + ########################### + for outWalk in os.walk(rootDir): + dirName=outWalk[0] + subdirList=outWalk[1] + if "OMRS" in subdirList: + rootScore=dirName + if(dirName.upper().find("\\OMRS\\")!=-1 and dirName.upper().find("\\XML")!=-1 and dirName.upper().find("\\FULLSCORE")!=-1): + arrDir=dirName.split("\\") + version=arrDir[len(arrDir)-2] + idmovement=arrDir[len(arrDir)-4] + files= ff.getAllXMLFiles(dirName) + myfolder=rootScore+"\\Process\\"+idmovement+"\\fullScore\\XML\\" + for f in files: + if not os.path.exists(myfolder): + os.makedirs(myfolder) + if not os.path.isfile(myfolder+"FS."+version+"."+f): + shutil.copy2(dirName+"\\"+f, myfolder+"FS."+version+"."+f) + + + + + + #################################### + # @param rootDir root process folder + def setGround(self,rootDir): + ''' + Process kern files in the OMRS folder (.krn) and set them as a "ground.xml" + in "Process" folder + + usage: + batchOMR=BatchOMR() + batchOMR.setGround("C:\\Users\\victor\\Desktop\\data") + ''' + for outWalk in os.walk(rootDir): + dirName=outWalk[0] + ff=FilesFunctions() + kernFile=ff.getKernFile(dirName) + newpath=dirName.replace("\\OMRS\\","\\Process\\") + + if not os.path.isfile(newpath+'\\ground.xml'): + if kernFile!=None: + + print dirName+"\\"+kernFile + xmlFile=ff.getXMLFile(dirName) + + #if we have a .xml file, we copy it + if xmlFile!=None: + shutil.copyfile(dirName+"\\"+xmlFile,newpath+"\\ground.xml") + else: + omr=converter.parse(dirName+"\\"+kernFile) + omr.write("musicxml", newpath+'\\ground.xml') +