def main(): #-----------Setting up and unsing option parser----------------------- parser=OptionParser(usage= usage, version=version) logger=logging.getLogger("exportToEMEP.py") parser.add_option("-l", "--loglevel", action="store",dest="loglevel",default=2, help="Sets the loglevel (0-3 where 3=full logging)") parser.add_option("-u", "--user", action="store", dest="user", default=None, help="Specify user manually") parser.add_option("-e", "--edb", action="store", dest="edb", default=None, help="Name of target edb") parser.add_option("-t", "--template", action="store",dest="cf",default=None, help="Generate default controlfile") parser.add_option("-f", "--force", action="store_true",dest="force",default=False, help="To start the process without confirming the domain") (options, args) = parser.parse_args() #------------Setting up logging capabilities ----------- rootLogger=logger.RootLogger(int(options.loglevel)) log=rootLogger.getLogger(sys.argv[0]) if options.cf!=None: generateCf(path.abspath(options.cf)) log.info("Wrote default controlfile") sys.exit() if len(args)!=1: parser.error("Incorrect number of arguments") domainName=os.environ["AVDBNAME"] dmn = domain.Domain(domainName) if options.edb ==None: parser.error("Need to specify edb using flag -e") if options.user ==None: parser.error("Need to specify user using flag -u") if not options.force: answer=raw_input("Chosen dbase is: "+domainName+", continue(y/n)?") if answer=="y": dmn=domain.Domain() else: sys.exit("Interrupted by user") if not dmn.edbExistForUser(options.edb,options.user): log.error("Edb "+options.edb+" does not exist for user "+options.user+" in domain "+domainName) sys.exit() edb=Edb(dmn.name,options.user,options.edb) rsrc=rsrc.Rsrc(edb.rsrcPath()) #Opening controlfile cf=controlfile.ControlFile(fileName=path.abspath(args[0])) substances=cf.findStringList("substances:") outputDir=cf.findExistingPath("outputDir:") acIndex=cf.findInt("acIndex:") #Get activity code tree codes=codetable.CodeTable(edb.rsrcPath(),acIndex=acIndex) datadb=datadb.Datadb(dmn,options.user,edb.name) datadb.read() substDict=dmn.listSubstanceIndices() #List grid names gridNames=edb.listGrids() for ac in codes.ac: if ac=="all": continue pdb.set_trace() log.debug("Activity code: "+ac) dataMarker = emepgrid.emepRaster() rasterDict={} substancesWithData=[] #Rereads grid list for each category to not fill the memory with emission grids #Grid data is only read for grids with current ac gridList=[] for gridName in gridNames: grd=Egrid(dmn.name,options.user,edb.name,gridName) grd.readAsc() if grd.hasFuel(): log.warning("Only support for non-fuel grids implemented, no processing done for grid "+gridName) break gridList.append(grd) for subst in substances: log.debug("Substance: "+subst) substInd=substDict[subst] totEmisRast=raster.Raster(Xll=1190000,Yll=6110000,Ncols=720,Nrows=1560,Cellsize=1000,init=0) for grd in gridList: if grd.par["ACTIVITYCODE"].val[0]==ac: if len(grd.substances)==0: grd.readData() totEmisRast=totEmisRast+grd.substances.get(substInd,0) for src in datadb.sources: if src.par["ACTIVITYCODE"].val[0]==ac: row,col=totEmisRast.getIndex(src.par["X1"].val,src.par["Y1"].val) totEmisRast.data[row,col]+=src.getEmis(substInd,rsrc,"ton/year") pdb.set_trace() if not totEmisRast.sum()==0: if subst not in substancesWithData: substancesWithData.append(subst) __RT90__="+proj=tmerc +lat_0=0 +lon_0=15d48\\'29.8\\\" +x_0=1500000 +k_0=1 +ellps=bessel +towgs84=414.1,41.3,603.1,-0.855,2.141,-7.023,0" emepRast = emepgrid.sortToEmep(totEmisRast,__RT90__,printInfo=True) dataMarker.data = numpy.where(emepRast.data > 0, 1, dataMarker.data) rasterDict[subst]=emepRast categoryDirPath = path.join(outputDir, ac) if not path.isdir(categoryDirPath): os.mkdir(categoryDirPath) fileName = path.join(categoryDirPath, "Emep50km_" + subst+ ".asc") emepRast.write(fileName) log.info("Emissions in EMEP-projection for substance: " + subst + "written to outputDir for category: " + ac) if len(rasterDict)>0: #creating substance header in the same order as the substances in the template header = "i\tj\t" #headerList=["SO2","NOx","NH3","NMVOC","CO","TSP","PM10","PM25","Pb ","Cd","Hg","As","Cr","Cu","Ni","Se","Zn","Aldrin","Chlordane","Chlordecone","Dieldrin","Endrin","Heptachlor","Hexabromobiphenyl","Mirex","Toxaphene","HCH","DDT","PCB","DIOX","PAH","HCB","PCP","SCCP"] for s in substancesWithData: header += s + "\t" #remove the tab after the last column and add a newline instead header = header[: - 1]+ "\n" #Creating file for EMEP-data fileName = "CLRTAP_" + ac + ".txt" categoryDirPath = path.join(outputDir, ac) if not path.isdir(categoryDirPath): os.mkdir(categoryDirPath) fid = open(path.join(categoryDirPath, fileName), 'w') fid.writelines(header) #Writing indexes and data for all non-zero elements for row in range(dataMarker.nrows): for col in range(dataMarker.ncols): if dataMarker.data[row, col] > 0: (i, j) = dataMarker.getCentreCoords(row, col) fid.write(str(i) + "\t" + str(j) + "\t") for substWithData in substancesWithData[:-1]: fid.write(str(rasterDict[substWithData].data[row, col]) + "\t") fid.write(str(rasterDict[substancesWithData[-1]].data[row, col]) + "\n") fid.close() log.info("wrote emissions to clrtap-file: " + path.join(categoryDirPath, fileName)) log.info("Finished")