o ngX@sddlZddlZddlZddlZddlZddlmZdZdZdZ dZ dZ dZ dd Z d*d d Zd d ZddZeejdkrLedededdZgZejddD])ZedreeddZqWejeZejes{ededZqWeeqWesededeegZeD]Zedee edZ!e e!j"dZ#ej$e#dZ%e!j&dj'Z(e!j&dj'Z)gZ*e+de(D]mZ,ee!de,durqee%e!e,Z-e e!j"d e,Z.ee!e,\Z/Z0e+de)D]FZ1ee!d!e,e1e d"Z2e2durqd#D]3Z3ee!e3d$e,e1Z4e4durqee.e-e/e0e e3e e2e e4g Z5e*e5er0ed%6d&d'e5Dqqqe7e*e!8qed(e9eeed)e9e:edS)+N) is_maskedFZARGOZNA1cCs|dddS)z!Get string value from NetCDF variable. The string variables are stored as bytes, so decode them and strip off any whitespace before or after. @param var NetCDF variable to read @returns string value from variable Nzutf-8)tobytesdecodestrip)varr D/lfs/h1/ops/prod/packages/evs.v1.0.19/ush/rtofs/read_argo_metplus.pyget_string_value&sr c Csr|dur|j|d|}|j||}|d|d}n |j|d||}|j|||}|d|d|d}t|}t|} |rWtrUtd|d|ddS| rhtrftd|d|d dSt|d krtrtd|d|d t|d dS|r|j|d } | r|dur| |n| ||} t| s| |krtd|d|d|dSt|S)a.!Get field value unless quality control checks do not pass. The conditions to skip data are as follows: 1) If {field_name}_QC is masked. 2) If {field_name} is masked. 3) If {field_name}_QC value is not equal to 1 (recommended from ARGO docs). 4) If error_max is set, skip if {field_name}_ERROR is not masked and less than the error_max value. @param nc_obj NetCDF object @param field_name name of field to read @param idx_p index of profile (1st dimension of data) @param idx_l (optional) index of level (2nd dimension of data). Defaults to None which assumes field is not 2D @param error_max (optional) value to compare to {field_name}_ERROR. Skip if error value is less than this value @returns numpy.float64 field value if all QC checks pass or None NZ_QC[]z][zSkip  z _QC is maskedz is maskedz _QC value (z) != 1Z_ERRORz _ERROR > ) variablesrDEBUGprintintgetnumpyfloat64) nc_obj field_nameZidx_pZidx_l error_maxZqcfieldZdata_strZqc_maskZ field_maskerrr r r get_val_check_qc0s:   rcCs0|jd|}tjt|d}||}|dS)a!Get valid time by adding julian days to the reference date time. @param ref_dt Datetime object of reference date time @param nc_obj NetCDF object @param idx index of profile to read @returns string of valid time in YYYYMMDD_HHMMSS format JULD)daysz %Y%m%d_%H%M%S)rdatetime timedeltafloatstrftime)Zref_dtridxZ julian_daysZ day_offsetZvalid_dtr r r get_valid_timehs r$cCs(t|jd|t|jd|fS)z!Read latitude and longitude values from NetCDF file at profile index. @param nc_obj NetCDF object @param idx index of profile to read @returns tuple of lat and lon values as floats ZLATITUDEZ LONGITUDE)rrr)rr#r r r get_lat_lonvsr%zERROR: z. - Must provide at least 1 input file argumentrTdebugzDebugging output turned onz"ERROR: Input file does not exist: zNumber of input files: zProcessing file: rZREFERENCE_DATE_TIMEz %Y%m%d%H%M%SZN_PROFZN_LEVELSrZPLATFORM_NUMBERZ PRES_ADJUSTED)r)ZTEMPZPSALZ _ADJUSTEDz, cCsg|]}t|qSr )str).0valr r r sr,z point_data: Data Length: z point_data: Data Type: )NN);sysosrZnetCDF4rnumpy.marrZ MESSAGE_TYPEZ ELEVATIONZLEVELZ QC_STRINGZMAX_PRESSURE_ERRORr rr$r%lenargvr__file__exitZis_okZ input_filesargendswithpath expandvarsZ input_fileexistsappendZ point_dataZDatasetZnc_inrZtime_strstrptimeZreference_date_time dimensionssizeZ num_profilesZ num_levelsZnew_point_datarangeZindex_pZ valid_timeZ station_idZlatZlonZindex_lZheightZvar_nameZobservation_valueZpointjoinextendclosereprtyper r r r s  8