Example #1
0
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")