#! /usr/bin/env python # encoding: utf-8 ''' @author: nick.bearson@ssec.wisc.edu Copyright (c) 2012 University of Wisconsin SSEC. All rights reserved. Usage: vcm ''' # FIXME: clean up includes post-split from datetime import datetime, timedelta from optparse import OptionParser import os import string import re import ConfigParser import ctypes import numpy as np from numpy.ctypeslib import ndpointer from pypre.files.HDF5File import HDF5File from pypre.variables.Variable import Variable import pyvcm.vcm_config as vcmc from pyvcm.vcm_include import imgr_bands, VIIRS_SHAPE, DEG2RAD import pyvcm.vcm_structs as vcms # ---------------------------------------------- ###################################################################################################### # UTILS # ######### def run_vcm(iFilename, oFilename): libFile = vcmc.get('libs', 'libcloudmask') thresholds = vcmc.get('thresholds', 'thresholds') print "Running VCM using..." print "VCM Library: ", libFile print "Thresholds file: ", thresholds lib = ctypes.cdll.LoadLibrary(libFile) lib_initVCM = lib.initializeCloudmaskDataStructures lib_callVCM = lib.call_vcm # lib_deleteVCM = lib.deleteVCMpointers vcm_dt = vcms.vcm_data_type() vcm_flags = vcms.vcm_flags_t() print "*** Calling initVCM ***" lib_initVCM(ctypes.byref(vcm_dt)) print "*** Returning initVCM ***" vcm_dt.act_scans = vcms.VIIRS_RDR_SCANS vcm_dt.lastModRow = vcms.M_VIIRS_SDR_ROWS vcm_dt.lastImgRow = vcms.I_VIIRS_SDR_ROWS # vcm_dt.threshCoeffs print vcm_dt.btI4.contents.Btemp print len(vcm_dt.btI4.contents.Btemp) print vcm_dt.btI4.contents.Btemp[0][0] iFile = HDF5File(iFilename) # FLATTEN - POSSIBLY CHANGE DATATYPE AS NEEDED print "Copying numpy arrays to ctypes landing zones!" def getLZ(structObj): return np.ctypeslib.as_array(structObj) def setLZ(var, structObj, deg2rad=False): # print "Copying %s" % (varStr) if deg2rad: var = var * DEG2RAD lz = getLZ(structObj) lz[:] = var[:] setLZ(iFile.readData("Latitude"), vcm_dt.geoData.contents.lat, True) setLZ(iFile.readData("Longitude"), vcm_dt.geoData.contents.lon, True) setLZ(iFile.readData("SatelliteZenithAngle"), vcm_dt.geoData.contents.satzen, True) setLZ(iFile.readData("SolarZenithAngle"), vcm_dt.geoData.contents.sunzen, True) setLZ(iFile.readData("SatelliteAzimuthAngle"), vcm_dt.geoData.contents.satazm, True) setLZ(iFile.readData("SolarAzimuthAngle"), vcm_dt.geoData.contents.sunazm, True) setLZ(iFile.readData("height"), vcm_dt.terrainHeight.contents.data) setLZ(iFile.readData("PrecipitableWater_L0"), vcm_dt.tpwIP.contents.data) setLZ(iFile.readData("10 metre wind speed"), vcm_dt.windSpeed.contents.data) setLZ(iFile.readData("SurfaceTemperature"), vcm_dt.sfc_temp.contents.data) setLZ(iFile.readData("qstlwm"), vcm_dt.qstLwm.contents.data) setLZ(iFile.readData("snowice"), vcm_dt.snow.contents.data) setLZ(iFile.readData("NDVI"), vcm_dt.toc_ndvi.contents.data) setLZ(iFile.readData("SVI04_BrightnessTemperature"), vcm_dt.btI4.contents.Btemp) setLZ(iFile.readData("SVI05_BrightnessTemperature"), vcm_dt.btI5.contents.Btemp) setLZ(iFile.readData("SVM12_BrightnessTemperature"), vcm_dt.btM12.contents.Btemp) setLZ(iFile.readData("SVM13_BrightnessTemperature"), vcm_dt.btM13.contents.Btemp) setLZ(iFile.readData("SVM14_BrightnessTemperature"), vcm_dt.btM14.contents.Btemp) setLZ(iFile.readData("SVM15_BrightnessTemperature"), vcm_dt.btM15.contents.Btemp) setLZ(iFile.readData("SVM16_BrightnessTemperature"), vcm_dt.btM16.contents.Btemp) setLZ(iFile.readData("SVM12_Radiance"), vcm_dt.radM12.contents.radiance) setLZ(iFile.readData("SVI01_Reflectance"), vcm_dt.reflI1.contents.reflect) setLZ(iFile.readData("SVI02_Reflectance"), vcm_dt.reflI2.contents.reflect) setLZ(iFile.readData("SVM01_Reflectance"), vcm_dt.reflM1.contents.reflect) setLZ(iFile.readData("SVM04_Reflectance"), vcm_dt.reflM4.contents.reflect) setLZ(iFile.readData("SVM05_Reflectance"), vcm_dt.reflM5.contents.reflect) setLZ(iFile.readData("SVM07_Reflectance"), vcm_dt.reflM7.contents.reflect) setLZ(iFile.readData("SVM08_Reflectance"), vcm_dt.reflM8.contents.reflect) setLZ(iFile.readData("SVM09_Reflectance"), vcm_dt.reflM9.contents.reflect) setLZ(iFile.readData("SVM10_Reflectance"), vcm_dt.reflM10.contents.reflect) setLZ(iFile.readData("SVM11_Reflectance"), vcm_dt.reflM11.contents.reflect) # copyToLZ(iFile.readData("SVM12_Reflectance"), vcm_dt.reflM12.contents.reflect) lib_callVCM(ctypes.byref(vcm_dt), ctypes.byref(vcm_flags), thresholds) print "Writing results to file: ", oFilename oFile = HDF5File(oFilename) def cmToFile(cmObj, n): lz = getLZ(cmObj) name = "All_Data/VIIRS-CM-IP_All/QF%d_VIIRSCMIP" % (n+1) cm = np.reshape(lz, VIIRS_SHAPE) cm = cm.astype(np.uint8) oFile.writeData(name, cm) cmToFile(vcm_dt.viirsCloudMaskIP.contents.vcm0, 0) cmToFile(vcm_dt.viirsCloudMaskIP.contents.vcm1, 1) cmToFile(vcm_dt.viirsCloudMaskIP.contents.vcm2, 2) cmToFile(vcm_dt.viirsCloudMaskIP.contents.vcm3, 3) cmToFile(vcm_dt.viirsCloudMaskIP.contents.vcm4, 4) cmToFile(vcm_dt.viirsCloudMaskIP.contents.vcm5, 5) print "Done." # cc = getLZ(vcm_flags.cloud_confidence) # print cc # # ca = getLZ(vcm_flags.cloud_adjacency) # print ca # # import pdb; pdb.set_trace() def main(): (options, args) = handle_args() iFilename = args[0] oFilename = args[1] if os.access(oFilename, os.F_OK): os.remove(oFilename) run_vcm(iFilename, oFilename) def handle_args(): parser = OptionParser() # parser.add_option("-g", "--geofile", action="store", type="string", dest="geoFile", help="geolocation file to use") # parser.add_option("-a", "--ancFile", action="store", type="string", dest="ancFile", help="ancilliary h5 file") # parser.add_option("-c", "--cmoFile", action="store", type="string", dest="cmoFile", help="cloudmask output h5 file") return parser.parse_args() if __name__ == "__main__": main()