From 11d21bbe95c66ee289562c450f21079b6beb6426 Mon Sep 17 00:00:00 2001 From: Stephen Gilbert Date: Tue, 8 Jul 2014 09:51:57 -0400 Subject: [PATCH] VLab Issue #4001 - NCEP EDEX and EDEX Common delivery for 14.2.1-n Fixes for Vors, Ncuair, and pressure change Change-Id: I11d77f5b359e3f73317a46ecf9addf81079c1616 Former-commit-id: a05e1a8190d28f3d09e373b8d8c5f46829bbc9e8 --- .../build.edex/opt/db/ddl/ncep/loadVors.sql | 2 +- .../edex_static/base/grib/grids/HiResUS.xml | 37 + .../base/grib/models/gribModels_NCEP-7.xml | 20 + .../impl/src/pgen/ActivityUtil.py | 20 +- .../ncuair/dao/NcUairToPointData.java | 736 +-- .../dataplugin/ncuair/dao/NcUairToRecord.java | 1195 +++-- .../common/metparameters/PressChange3Hr.java | 16 +- .../PressureChange3HrAndTendency.java | 11 +- .../parameterconversion/PRLibrary.java | 21 +- .../edex/common/sounding/NcSoundingLayer.java | 50 +- .../edex_static/base/ncep/stns/vors.xml | 12 + .../edex_static/base/distribution/nctext.xml | 7 + .../res/pointdata/ncuair.xml | 27 + .../uengine/tasks/profile/NcSoundingDrv.java | 3989 +++++++++-------- 14 files changed, 3435 insertions(+), 2708 deletions(-) create mode 100644 edexOsgi/com.raytheon.edex.plugin.grib/utility/edex_static/base/grib/grids/HiResUS.xml diff --git a/edexOsgi/build.edex/opt/db/ddl/ncep/loadVors.sql b/edexOsgi/build.edex/opt/db/ddl/ncep/loadVors.sql index bc0e5fa10b..b15ad39e6a 100644 --- a/edexOsgi/build.edex/opt/db/ddl/ncep/loadVors.sql +++ b/edexOsgi/build.edex/opt/db/ddl/ncep/loadVors.sql @@ -313,7 +313,7 @@ COPY stns.VORS(PKEY, STATION_ID, STATION_NUM, NAME, STATE, COUNTRY, LATITUDE, LO 312,RBL,225,RED_BLUFF,CA,US,40.1,-122.24 313,SEA,243,SEATTLE,WA,US,47.44,-122.31 314,HUH,35,WHATCOM,WA,US,48.95,-122.58 -315,PDX,208,PORTLAND,OR,US,45.58,-122.6 +315,BTG,208,BATTLE_GROUND,WA,US,45.75,-122.59 316,PYE,371,POINT_REYES,CA,US,38.08,-122.87 317,OED,362,MEDFORD,OR,US,42.48,-122.91 318,EUG,93,EUGENE,OR,US,44.12,-123.22 diff --git a/edexOsgi/com.raytheon.edex.plugin.grib/utility/edex_static/base/grib/grids/HiResUS.xml b/edexOsgi/com.raytheon.edex.plugin.grib/utility/edex_static/base/grib/grids/HiResUS.xml new file mode 100644 index 0000000000..3c01ddf88c --- /dev/null +++ b/edexOsgi/com.raytheon.edex.plugin.grib/utility/edex_static/base/grib/grids/HiResUS.xml @@ -0,0 +1,37 @@ + + + + 14731025001 + HIRES - 5 km Western US + 12.19 + -133.459 + LowerLeft + 1473 + 1025 + 5.079 + 5.079 + km + 6371229.0 + 6371229.0 + -95.0 + 25. + 25. + diff --git a/edexOsgi/com.raytheon.edex.plugin.grib/utility/edex_static/base/grib/models/gribModels_NCEP-7.xml b/edexOsgi/com.raytheon.edex.plugin.grib/utility/edex_static/base/grib/models/gribModels_NCEP-7.xml index 25b035621d..bb3547d1f0 100644 --- a/edexOsgi/com.raytheon.edex.plugin.grib/utility/edex_static/base/grib/models/gribModels_NCEP-7.xml +++ b/edexOsgi/com.raytheon.edex.plugin.grib/utility/edex_static/base/grib/models/gribModels_NCEP-7.xml @@ -1435,6 +1435,26 @@ + + HiResW-NMM-US +
7
+ 0 + 14731025001 + + 112 + +
+ + + HiResW-ARW-US +
7
+ 0 + 14731025001 + + 116 + +
+ HiResW-NMM-East
7
diff --git a/edexOsgi/com.raytheon.uf.tools.cli/impl/src/pgen/ActivityUtil.py b/edexOsgi/com.raytheon.uf.tools.cli/impl/src/pgen/ActivityUtil.py index 0c1a067b68..a5bc9cd310 100644 --- a/edexOsgi/com.raytheon.uf.tools.cli/impl/src/pgen/ActivityUtil.py +++ b/edexOsgi/com.raytheon.uf.tools.cli/impl/src/pgen/ActivityUtil.py @@ -41,7 +41,7 @@ return query.execute()''' if not ch.isGoodStatus(): print ch.formatResponse() - exit(1) + exit(1) return self.__generateMap( ch.getContents() ) @@ -147,19 +147,19 @@ query.addReturnedField("dataTime.refTime") return query.execute()'''.format(atype,label) - service = '/services/pyproductjaxb' - host = os.getenv("DEFAULT_HOST", "localhost") - port = os.getenv("DEFAULT_PORT", "9581") - connection=str(host+":"+port) - ch = CH.CommHandler(connection,service) - ch.process(script) + service = '/services/pyproductjaxb' + host = os.getenv("DEFAULT_HOST", "localhost") + port = os.getenv("DEFAULT_PORT", "9581") + connection=str(host+":"+port) + ch = CH.CommHandler(connection,service) + ch.process(script) - if not ch.isGoodStatus(): + if not ch.isGoodStatus(): print ch.formatResponse() exit(1) - logger.debug( ch.getContents() ) - return __parseResponse( ch.getContents() ) + logger.debug( ch.getContents() ) + return __parseResponse( ch.getContents() ) # # Parses the XML response from the uEngine and extracts diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.ncuair/src/gov/noaa/nws/ncep/common/dataplugin/ncuair/dao/NcUairToPointData.java b/ncep/gov.noaa.nws.ncep.common.dataplugin.ncuair/src/gov/noaa/nws/ncep/common/dataplugin/ncuair/dao/NcUairToPointData.java index 47daa33cf6..3241405b17 100644 --- a/ncep/gov.noaa.nws.ncep.common.dataplugin.ncuair/src/gov/noaa/nws/ncep/common/dataplugin/ncuair/dao/NcUairToPointData.java +++ b/ncep/gov.noaa.nws.ncep.common.dataplugin.ncuair/src/gov/noaa/nws/ncep/common/dataplugin/ncuair/dao/NcUairToPointData.java @@ -16,7 +16,7 @@ * remove xml serialization as well * * 10/2011 S. Gurung Added changes related to getting stid/lat/lon/elev * from database instead of snstns.xml file - * + * 6/2014 T.Lee Added support XXAA, XXBB, XXCC, XXDD * * * This code has been developed by the SIB for use in the AWIPS2 system. @@ -26,6 +26,12 @@ package gov.noaa.nws.ncep.common.dataplugin.ncuair.dao; +import gov.noaa.nws.ncep.common.dataplugin.ncuair.NcUairLiftedIndex; +import gov.noaa.nws.ncep.common.dataplugin.ncuair.NcUairMaxWind; +import gov.noaa.nws.ncep.common.dataplugin.ncuair.NcUairObsLevels; +import gov.noaa.nws.ncep.common.dataplugin.ncuair.NcUairRecord; +import gov.noaa.nws.ncep.common.dataplugin.ncuair.NcUairTropopause; + import java.io.File; import java.util.HashMap; import java.util.Iterator; @@ -37,109 +43,213 @@ import com.raytheon.uf.common.pointdata.PointDataContainer; import com.raytheon.uf.common.pointdata.PointDataDescription; import com.raytheon.uf.common.pointdata.PointDataView; -import gov.noaa.nws.ncep.common.dataplugin.ncuair.NcUairLiftedIndex; -import gov.noaa.nws.ncep.common.dataplugin.ncuair.NcUairMaxWind; -import gov.noaa.nws.ncep.common.dataplugin.ncuair.NcUairObsLevels; -import gov.noaa.nws.ncep.common.dataplugin.ncuair.NcUairTropopause; -import gov.noaa.nws.ncep.common.dataplugin.ncuair.NcUairRecord; - public class NcUairToPointData { - private static final String RAW_DATA = "RAWDATA"; + private static final String RAW_DATA = "RAWDATA"; + private static final String UTC = "UTC"; + private static final String REPORT_TYPE = "REPORTTYPE"; + private static final String STATION_ID = "STATIONID"; + private static final String ISSUE_TIME = "ISSUETIME"; - private static final String OBS_TIME = "OBSTIME"; + + private static final String OBS_TIME = "OBSTIME"; + private static final String SYNOPTIC_TIME = "SYNOPTIME"; + private static final String DATAURI = "DATAURI"; - private static final String DATA_TYPE = "DATATYPE"; + + private static final String DATA_TYPE = "DATATYPE"; + private static final String CORRECTION_INDICATOR = "CORR"; + private static final String WMO_HEADER = "WMOHEADER"; + private static final String STATION_NUMBER = "STNUM"; + private static final String LATITUDE = "LATITUDE"; + private static final String LONGITUDE = "LONGITUDE"; + private static final String ELEVATION = "ELEVATION"; + private static final String NIL = "NIL"; + private static final String TTAA_PRES = "TTAA_PRES"; + private static final String TTAA_TEMP = "TTAA_TEMP"; + private static final String TTAA_DWPT = "TTAA_DWPT"; + private static final String TTAA_DRCT = "TTAA_DRCT"; + private static final String TTAA_SPED = "TTAA_SPED"; + private static final String TTAA_HGHT = "TTAA_HGHT"; + private static final String TTBB_PRES = "TTBB_PRES"; + private static final String TTBB_TEMP = "TTBB_TEMP"; + private static final String TTBB_DWPT = "TTBB_DWPT"; + private static final String TTCC_PRES = "TTCC_PRES"; + private static final String TTCC_TEMP = "TTCC_TEMP"; + private static final String TTCC_DWPT = "TTCC_DWPT"; + private static final String TTCC_DRCT = "TTCC_DRCT"; + private static final String TTCC_SPED = "TTCC_SPED"; + private static final String TTCC_HGHT = "TTCC_HGHT"; + private static final String TTDD_PRES = "TTDD_PRES"; + private static final String TTDD_TEMP = "TTDD_TEMP"; + private static final String TTDD_DWPT = "TTDD_DWPT"; + private static final String PPAA_PRES = "PPAA_PRES"; + private static final String PPAA_TEMP = "PPAA_TEMP"; + private static final String PPAA_DWPT = "PPAA_DWPT"; - private static final String PPAA_DRCT = "PPAA_DRCT"; - private static final String PPAA_SPED = "PPAA_SPED"; + + private static final String PPAA_DRCT = "PPAA_DRCT"; + + private static final String PPAA_SPED = "PPAA_SPED"; + private static final String PPAA_HGHT = "PPAA_HGHT"; + private static final String PPBB_DRCT = "PPBB_DRCT"; + private static final String PPBB_SPED = "PPBB_SPED"; + private static final String PPBB_HGHT = "PPBB_HGHT"; + private static final String PPCC_PRES = "PPCC_PRES"; + private static final String PPCC_TEMP = "PPCC_TEMP"; + private static final String PPCC_DWPT = "PPCC_DWPT"; + private static final String PPCC_DRCT = "PPCC_DRCT"; + private static final String PPCC_SPED = "PPCC_SPED"; + private static final String PPCC_HGHT = "PPCC_HGHT"; + private static final String PPDD_DRCT = "PPDD_DRCT"; + private static final String PPDD_SPED = "PPDD_SPED"; + private static final String PPDD_HGHT = "PPDD_HGHT"; + private static final String TROP_PRES = "TROP_PRES"; + private static final String TROP_TEMP = "TROP_TEMP"; + private static final String TROP_DWPT = "TROP_DWPT"; + private static final String TROP_DRCT = "TROP_DRCT"; + private static final String TROP_SPED = "TROP_SPED"; + private static final String WMAX_PRES = "WMAX_PRES"; + private static final String WMAX_DRCT = "WMAX_DRCT"; + private static final String WMAX_SPED = "WMAX_SPED"; + private static final String WMAX_LO_SHEAR = "WMAX_LO_SHEAR"; + private static final String WMAX_HI_SHEAR = "WMAX_HI_SHEAR"; + private static final String TTAA_LIFT = "TTAA_LIFT"; + private static final String TTAA_LO_MEAN_DRCT = "TTAA_LO_MEAN_DRCT"; + private static final String TTAA_LO_MEAN_SPED = "TTAA_LO_MEAN_SPED"; + private static final String TTAA_HI_MEAN_DRCT = "TTAA_HI_MEAN_DRCT"; + private static final String TTAA_HI_MEAN_SPED = "TTAA_HI_MEAN_SPED"; + private static final String TTBB_LIFT = "TTBB_LIFT"; + private static final String TTBB_LO_MEAN_DRCT = "TTBB_LO_MEAN_DRCT"; + private static final String TTBB_LO_MEAN_SPED = "TTBB_LO_MEAN_SPED"; + private static final String TTBB_HI_MEAN_DRCT = "TTBB_HI_MEAN_DRCT"; + private static final String TTBB_HI_MEAN_SPED = "TTBB_HI_MEAN_SPED"; - - private enum REPORTTYPE {TTAA, TTBB, TTCC, TTDD, PPAA, PPBB, PPCC, PPDD, - UUAA, UUBB, UUCC, UUDD, XXAA, XXBB, XXCC, XXDD}; + + private static final String XXAA_PRES = "XXAA_PRES"; + + private static final String XXAA_TEMP = "XXAA_TEMP"; + + private static final String XXAA_DWPT = "XXAA_DWPT"; + + private static final String XXAA_DRCT = "XXAA_DRCT"; + + private static final String XXAA_SPED = "XXAA_SPED"; + + private static final String XXAA_HGHT = "XXAA_HGHT"; + + private static final String XXBB_PRES = "XXBB_PRES"; + + private static final String XXBB_TEMP = "XXBB_TEMP"; + + private static final String XXBB_DWPT = "XXBB_DWPT"; + + private static final String XXCC_PRES = "XXCC_PRES"; + + private static final String XXCC_TEMP = "XXCC_TEMP"; + + private static final String XXCC_DWPT = "XXCC_DWPT"; + + private static final String XXCC_DRCT = "XXCC_DRCT"; + + private static final String XXCC_SPED = "XXCC_SPED"; + + private static final String XXCC_HGHT = "XXCC_HGHT"; + + private static final String XXDD_PRES = "XXDD_PRES"; + + private static final String XXDD_TEMP = "XXDD_TEMP"; + + private static final String XXDD_DWPT = "XXDD_DWPT"; + + private enum REPORTTYPE { + TTAA, TTBB, TTCC, TTDD, PPAA, PPBB, PPCC, PPDD, UUAA, UUBB, UUCC, UUDD, XXAA, XXBB, XXCC, XXDD + }; /** * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! It is important to - * keep this up to date or risk breaking backwards compatibility - * uu + * keep this up to date or risk breaking backwards compatibility uu */ - private static final String[] ALL_PARAMS = { RAW_DATA, UTC, REPORT_TYPE, STATION_ID, - ISSUE_TIME, OBS_TIME, SYNOPTIC_TIME, DATAURI, DATA_TYPE, CORRECTION_INDICATOR, - WMO_HEADER, STATION_NUMBER, LATITUDE, LONGITUDE, ELEVATION, NIL, - TTAA_PRES, TTAA_TEMP, TTAA_DWPT, TTAA_DRCT, TTAA_SPED, TTAA_HGHT, - TTBB_PRES, TTBB_TEMP, TTBB_DWPT, - TTCC_PRES, TTCC_TEMP, TTCC_DWPT, TTCC_DRCT, TTCC_SPED, TTCC_HGHT, - TTDD_PRES, TTDD_TEMP, TTDD_DWPT, - PPAA_PRES, PPAA_TEMP, PPAA_DWPT, PPAA_DRCT, PPAA_SPED, PPAA_HGHT, - PPBB_DRCT, PPBB_SPED, PPBB_HGHT, - PPCC_PRES, PPCC_TEMP, PPCC_DWPT, PPCC_DRCT, PPCC_SPED, PPCC_HGHT, - PPDD_DRCT, PPDD_SPED, PPDD_HGHT, - TROP_PRES, TROP_TEMP, TROP_DWPT, TROP_DRCT, TROP_SPED, WMAX_PRES, - WMAX_DRCT, WMAX_SPED, WMAX_LO_SHEAR, WMAX_HI_SHEAR, - TTAA_LIFT, TTAA_LO_MEAN_DRCT, TTAA_LO_MEAN_SPED, TTAA_HI_MEAN_DRCT, TTAA_HI_MEAN_SPED, - TTBB_LIFT, TTBB_LO_MEAN_DRCT, TTBB_LO_MEAN_SPED, TTBB_HI_MEAN_DRCT, TTAA_HI_MEAN_SPED,}; + private static final String[] ALL_PARAMS = { RAW_DATA, UTC, REPORT_TYPE, + STATION_ID, ISSUE_TIME, OBS_TIME, SYNOPTIC_TIME, DATAURI, + DATA_TYPE, CORRECTION_INDICATOR, WMO_HEADER, STATION_NUMBER, + LATITUDE, LONGITUDE, ELEVATION, NIL, TTAA_PRES, TTAA_TEMP, + TTAA_DWPT, TTAA_DRCT, TTAA_SPED, TTAA_HGHT, TTBB_PRES, TTBB_TEMP, + TTBB_DWPT, TTCC_PRES, TTCC_TEMP, TTCC_DWPT, TTCC_DRCT, TTCC_SPED, + TTCC_HGHT, TTDD_PRES, TTDD_TEMP, TTDD_DWPT, PPAA_PRES, PPAA_TEMP, + PPAA_DWPT, PPAA_DRCT, PPAA_SPED, PPAA_HGHT, PPBB_DRCT, PPBB_SPED, + PPBB_HGHT, PPCC_PRES, PPCC_TEMP, PPCC_DWPT, PPCC_DRCT, PPCC_SPED, + PPCC_HGHT, PPDD_DRCT, PPDD_SPED, PPDD_HGHT, TROP_PRES, TROP_TEMP, + TROP_DWPT, TROP_DRCT, TROP_SPED, WMAX_PRES, WMAX_DRCT, WMAX_SPED, + WMAX_LO_SHEAR, WMAX_HI_SHEAR, TTAA_LIFT, TTAA_LO_MEAN_DRCT, + TTAA_LO_MEAN_SPED, TTAA_HI_MEAN_DRCT, TTAA_HI_MEAN_SPED, TTBB_LIFT, + TTBB_LO_MEAN_DRCT, TTBB_LO_MEAN_SPED, TTBB_HI_MEAN_DRCT, + TTAA_HI_MEAN_SPED, XXAA_PRES, XXAA_TEMP, XXAA_DWPT, XXAA_DRCT, + XXAA_SPED, XXAA_HGHT, XXBB_PRES, XXBB_TEMP, XXBB_DWPT, XXCC_PRES, + XXCC_TEMP, XXCC_DWPT, XXCC_DRCT, XXCC_SPED, XXCC_HGHT, XXDD_PRES, + XXDD_TEMP, XXDD_DWPT }; public static final String ALL_PARAMS_LIST; static { @@ -171,8 +281,9 @@ public class NcUairToPointData { } public PluginDataObject[] toPointData(PluginDataObject[] pdo) { - //long curTime = System.currentTimeMillis(); - //System.out.println("H5 uair toPointData entered, pdo size = "+ pdo.length); + // long curTime = System.currentTimeMillis(); + // System.out.println("H5 uair toPointData entered, pdo size = "+ + // pdo.length); if (pdo.length > 0) { Map pointMap = new HashMap(); @@ -181,7 +292,7 @@ public class NcUairToPointData { continue; File f = this.dao.getFullFilePath(p); PointDataContainer pdc = pointMap.get(f); - + if (pdc == null) { pdc = PointDataContainer.build(this.pdd); pointMap.put(f, pdc); @@ -189,310 +300,389 @@ public class NcUairToPointData { NcUairRecord mr = (NcUairRecord) p; PointDataView pdv = buildView(pdc, mr); mr.setPointDataView(pdv); - + } } - //long enqueueTime = System.currentTimeMillis(); - //double latency = (enqueueTime-curTime) ; - //System.out.println("H5 uair toPointData spend "+ latency); + // long enqueueTime = System.currentTimeMillis(); + // double latency = (enqueueTime-curTime) ; + // System.out.println("H5 uair toPointData spend "+ latency); return pdo; } - + private PointDataView buildView(PointDataContainer container, NcUairRecord record) { PointDataView pdv = container.append(); pdv.setString(STATION_ID, record.getStationId()); - + int maxManLevel = -1; int maxSigTempLevel = -1; int maxSigWindLevel = -1; int maxWmaxLevel = -1; int maxTropLevel = -1; int maxMiscLevel = -1; - - Dimension [] dims = pdd.dimensions; - for(Dimension d : dims) { - if("maxManLevel".equals(d.getDimensionName())) { + Dimension[] dims = pdd.dimensions; + for (Dimension d : dims) { + + if ("maxManLevel".equals(d.getDimensionName())) { maxManLevel = d.getDimensionLength(); } - - if("maxSigTempLevel".equals(d.getDimensionName())) { + + if ("maxSigTempLevel".equals(d.getDimensionName())) { maxSigTempLevel = d.getDimensionLength(); } - - if("maxSigWindLevel".equals(d.getDimensionName())) { + + if ("maxSigWindLevel".equals(d.getDimensionName())) { maxSigWindLevel = d.getDimensionLength(); } - - if("maxWmaxLevel".equals(d.getDimensionName())) { + + if ("maxWmaxLevel".equals(d.getDimensionName())) { maxWmaxLevel = d.getDimensionLength(); } - - if("maxTropLevel".equals(d.getDimensionName())) { + + if ("maxTropLevel".equals(d.getDimensionName())) { maxTropLevel = d.getDimensionLength(); } - - if("maxMiscLevel".equals(d.getDimensionName())) { + + if ("maxMiscLevel".equals(d.getDimensionName())) { maxMiscLevel = d.getDimensionLength(); } } - + if (record.getCorr() != null) { - pdv.setString(CORRECTION_INDICATOR,record.getCorr()); + pdv.setString(CORRECTION_INDICATOR, record.getCorr()); } else { pdv.setString(CORRECTION_INDICATOR, ""); } - if (record.getLocation()!=null) { - pdv.setFloat(LATITUDE, (float) record.getLatitude()); - pdv.setFloat(LONGITUDE, (float) record.getLongitude()); - if(record.getElevation()!=null) - pdv.setFloat(ELEVATION, (float) record.getElevation()); + if (record.getLocation() != null) { + pdv.setFloat(LATITUDE, (float) record.getLatitude()); + pdv.setFloat(LONGITUDE, (float) record.getLongitude()); + if (record.getElevation() != null) + pdv.setFloat(ELEVATION, (float) record.getElevation()); } - if(record.getObsTime()!=null) - pdv.setLong(OBS_TIME, record.getObsTime().getTime().getTime()); - if(record.getSynopticTime()!=null) - pdv.setLong(SYNOPTIC_TIME, record.getSynopticTime().getTime().getTime()); - if(record.getIssueTime()!=null) - pdv.setLong(ISSUE_TIME, record.getIssueTime().getTime().getTime()); - pdv.setString(DATAURI, record.getDataURI()); - pdv.setString(DATA_TYPE, record.getDataType()); + if (record.getObsTime() != null) + pdv.setLong(OBS_TIME, record.getObsTime().getTime().getTime()); + if (record.getSynopticTime() != null) + pdv.setLong(SYNOPTIC_TIME, record.getSynopticTime().getTime() + .getTime()); + if (record.getIssueTime() != null) + pdv.setLong(ISSUE_TIME, record.getIssueTime().getTime().getTime()); + pdv.setString(DATAURI, record.getDataURI()); + pdv.setString(DATA_TYPE, record.getDataType()); pdv.setString(REPORT_TYPE, record.getReportType()); pdv.setString(WMO_HEADER, record.getWmoHeader()); pdv.setString(STATION_NUMBER, record.getStnum()); - if(record.getNil()!=null) - pdv.setString(NIL, record.getNil().toString()); + if (record.getNil() != null) + pdv.setString(NIL, record.getNil().toString()); pdv.setInt(UTC, record.getUTC()); pdv.setString(RAW_DATA, record.getBullMessage()); int index; - - if ( record.getObsLevels() != null ) { + + if (record.getObsLevels() != null) { Iterator sls = record.getObsLevels().iterator(); - switch ( REPORTTYPE.valueOf(record.getDataType()) ) { - + switch (REPORTTYPE.valueOf(record.getDataType())) { + case TTAA: case UUAA: - case XXAA: + index = 0; - if (sls !=null ) { - while (sls.hasNext()) { - NcUairObsLevels sl = sls.next(); - if ( sl.getPres() > 0 && index < maxManLevel ) { - pdv.setFloat(TTAA_PRES, sl.getPres(), index); - pdv.setFloat(TTAA_HGHT, sl.getHght(), index); - pdv.setFloat(TTAA_TEMP, sl.getTemp(), index); - pdv.setFloat(TTAA_DWPT, sl.getDwpt(), index); - pdv.setFloat(TTAA_DRCT, sl.getDrct(), index); - pdv.setFloat(TTAA_SPED, sl.getSped(), index); - index++; - } - } - pdv.setInt("numTTAA", index); + if (sls != null) { + while (sls.hasNext()) { + NcUairObsLevels sl = sls.next(); + if (sl.getPres() > 0 && index < maxManLevel) { + pdv.setFloat(TTAA_PRES, sl.getPres(), index); + pdv.setFloat(TTAA_HGHT, sl.getHght(), index); + pdv.setFloat(TTAA_TEMP, sl.getTemp(), index); + pdv.setFloat(TTAA_DWPT, sl.getDwpt(), index); + pdv.setFloat(TTAA_DRCT, sl.getDrct(), index); + pdv.setFloat(TTAA_SPED, sl.getSped(), index); + index++; + } + } + pdv.setInt("numTTAA", index); } break; - - case TTBB: + case XXAA: + index = 0; + if (sls != null) { + while (sls.hasNext()) { + NcUairObsLevels sl = sls.next(); + if (sl.getPres() > 0 && index < maxManLevel) { + pdv.setFloat(XXAA_PRES, sl.getPres(), index); + pdv.setFloat(XXAA_HGHT, sl.getHght(), index); + pdv.setFloat(XXAA_TEMP, sl.getTemp(), index); + pdv.setFloat(XXAA_DWPT, sl.getDwpt(), index); + pdv.setFloat(XXAA_DRCT, sl.getDrct(), index); + pdv.setFloat(XXAA_SPED, sl.getSped(), index); + index++; + } + } + pdv.setInt("numXXAA", index); + } + + break; + + case TTBB: case UUBB: + + index = 0; + if (sls != null) { + while (sls.hasNext()) { + NcUairObsLevels sl = sls.next(); + if (sl.getPres() > 0 && index < maxSigTempLevel) { + pdv.setFloat(TTBB_PRES, sl.getPres(), index); + pdv.setFloat(TTBB_TEMP, sl.getTemp(), index); + pdv.setFloat(TTBB_DWPT, sl.getDwpt(), index); + index++; + } + } + pdv.setInt("numTTBB", index); + } + break; case XXBB: - index = 0; - if ( sls != null ) { - while (sls.hasNext() ) { - NcUairObsLevels sl = sls.next(); - if ( sl.getPres() > 0 && index < maxSigTempLevel ) { - pdv.setFloat(TTBB_PRES, sl.getPres(), index); - pdv.setFloat(TTBB_TEMP, sl.getTemp(), index); - pdv.setFloat(TTBB_DWPT, sl.getDwpt(), index); - index++; - } - } - pdv.setInt("numTTBB", index); - } - break; - + index = 0; + if (sls != null) { + while (sls.hasNext()) { + NcUairObsLevels sl = sls.next(); + if (sl.getPres() > 0 && index < maxSigTempLevel) { + pdv.setFloat(XXBB_PRES, sl.getPres(), index); + pdv.setFloat(XXBB_TEMP, sl.getTemp(), index); + pdv.setFloat(XXBB_DWPT, sl.getDwpt(), index); + index++; + } + } + pdv.setInt("numXXBB", index); + } + break; + case TTCC: case UUCC: - case XXCC: - index = 0; - if ( sls != null ) { - while (sls.hasNext() ) { - NcUairObsLevels sl = sls.next(); - if ( sl.getPres() > 0 && index < maxManLevel ) { - pdv.setFloat(TTCC_PRES, sl.getPres(), index); - pdv.setFloat(TTCC_HGHT, sl.getHght(), index); - pdv.setFloat(TTCC_TEMP, sl.getTemp(), index); - pdv.setFloat(TTCC_DWPT, sl.getDwpt(), index); - pdv.setFloat(TTCC_DRCT, sl.getDrct(), index); - pdv.setFloat(TTCC_SPED, sl.getSped(), index); - index++; - } - } - pdv.setInt("numTTCC",index); - } - break; + index = 0; + if (sls != null) { + while (sls.hasNext()) { + NcUairObsLevels sl = sls.next(); + if (sl.getPres() > 0 && index < maxManLevel) { + + pdv.setFloat(TTCC_PRES, sl.getPres(), index); + pdv.setFloat(TTCC_HGHT, sl.getHght(), index); + pdv.setFloat(TTCC_TEMP, sl.getTemp(), index); + pdv.setFloat(TTCC_DWPT, sl.getDwpt(), index); + pdv.setFloat(TTCC_DRCT, sl.getDrct(), index); + pdv.setFloat(TTCC_SPED, sl.getSped(), index); + index++; + } + } + pdv.setInt("numTTCC", index); + } + break; + case XXCC: + index = 0; + if (sls != null) { + while (sls.hasNext()) { + NcUairObsLevels sl = sls.next(); + if (sl.getPres() > 0 && index < maxManLevel) { + + pdv.setFloat(XXCC_PRES, sl.getPres(), index); + pdv.setFloat(XXCC_HGHT, sl.getHght(), index); + pdv.setFloat(XXCC_TEMP, sl.getTemp(), index); + pdv.setFloat(XXCC_DWPT, sl.getDwpt(), index); + pdv.setFloat(XXCC_DRCT, sl.getDrct(), index); + pdv.setFloat(XXCC_SPED, sl.getSped(), index); + index++; + } + } + pdv.setInt("numXXCC", index); + } + break; case TTDD: case UUDD: + + index = 0; + if (sls != null) { + while (sls.hasNext()) { + NcUairObsLevels sl = sls.next(); + if (sl.getPres() > 0 && index < maxSigTempLevel) { + pdv.setFloat(TTDD_PRES, sl.getPres(), index); + pdv.setFloat(TTDD_TEMP, sl.getTemp(), index); + pdv.setFloat(TTDD_DWPT, sl.getDwpt(), index); + index++; + } + } + pdv.setInt("numTTDD", index); + } + break; case XXDD: - index = 0; - if ( sls != null ) { - while (sls.hasNext() ) { - NcUairObsLevels sl = sls.next(); - if ( sl.getPres() > 0 && index < maxSigTempLevel ) { - pdv.setFloat(TTDD_PRES, sl.getPres(), index); - pdv.setFloat(TTDD_TEMP, sl.getTemp(), index); - pdv.setFloat(TTDD_DWPT, sl.getDwpt(), index); - index++; - } - } - pdv.setInt("numTTDD", index); - } - break; - + index = 0; + if (sls != null) { + while (sls.hasNext()) { + NcUairObsLevels sl = sls.next(); + if (sl.getPres() > 0 && index < maxSigTempLevel) { + pdv.setFloat(XXDD_PRES, sl.getPres(), index); + pdv.setFloat(XXDD_TEMP, sl.getTemp(), index); + pdv.setFloat(XXDD_DWPT, sl.getDwpt(), index); + index++; + } + } + pdv.setInt("numXXDD", index); + } + break; + case PPAA: - index = 0; - if ( sls != null ) { - while (sls.hasNext()) { - NcUairObsLevels sl = sls.next(); - if ( sl.getPres() > 0 && index < maxManLevel ) { - pdv.setFloat(PPAA_PRES, sl.getPres(), index); - pdv.setFloat(PPAA_HGHT, sl.getHght(), index); - pdv.setFloat(PPAA_TEMP, sl.getTemp(), index); - pdv.setFloat(PPAA_DWPT, sl.getDwpt(), index); - pdv.setFloat(PPAA_DRCT, sl.getDrct(), index); - pdv.setFloat(PPAA_SPED, sl.getSped(), index); - index++; - } - } - pdv.setInt("numPPAA", index); - } - break; + index = 0; + if (sls != null) { + while (sls.hasNext()) { + NcUairObsLevels sl = sls.next(); + if (sl.getPres() > 0 && index < maxManLevel) { + pdv.setFloat(PPAA_PRES, sl.getPres(), index); + pdv.setFloat(PPAA_HGHT, sl.getHght(), index); + pdv.setFloat(PPAA_TEMP, sl.getTemp(), index); + pdv.setFloat(PPAA_DWPT, sl.getDwpt(), index); + pdv.setFloat(PPAA_DRCT, sl.getDrct(), index); + pdv.setFloat(PPAA_SPED, sl.getSped(), index); + index++; + } + } + pdv.setInt("numPPAA", index); + } + break; case PPBB: - index = 0; - if ( sls != null ) { - while (sls.hasNext()) { - NcUairObsLevels sl = sls.next(); - if ( sl.getHght() > 0 && index < maxSigWindLevel ) { - pdv.setFloat(PPBB_HGHT, sl.getHght(), index); - pdv.setFloat(PPBB_DRCT, sl.getDrct(), index); - pdv.setFloat(PPBB_SPED, sl.getSped(), index); - index++; - } - } - pdv.setInt ("numPPBB", index); - } - break; - + index = 0; + if (sls != null) { + while (sls.hasNext()) { + NcUairObsLevels sl = sls.next(); + if (sl.getHght() > 0 && index < maxSigWindLevel) { + pdv.setFloat(PPBB_HGHT, sl.getHght(), index); + pdv.setFloat(PPBB_DRCT, sl.getDrct(), index); + pdv.setFloat(PPBB_SPED, sl.getSped(), index); + index++; + } + } + pdv.setInt("numPPBB", index); + } + break; + case PPCC: - index = 0; - if (sls !=null ) { - while (sls.hasNext()) { - NcUairObsLevels sl = sls.next(); - if ( (sl.getPres() > 0 || sl.getHght() > 0 ) && index < maxManLevel ) { - pdv.setFloat(PPCC_PRES, sl.getPres(), index); - pdv.setFloat(PPCC_HGHT, sl.getHght(), index); - pdv.setFloat(PPCC_TEMP, sl.getTemp(), index); - pdv.setFloat(PPCC_DWPT, sl.getDwpt(), index); - pdv.setFloat(PPCC_DRCT, sl.getDrct(), index); - pdv.setFloat(PPCC_SPED, sl.getSped(), index); - index++; + index = 0; + if (sls != null) { + while (sls.hasNext()) { + NcUairObsLevels sl = sls.next(); + if ((sl.getPres() > 0 || sl.getHght() > 0) + && index < maxManLevel) { + pdv.setFloat(PPCC_PRES, sl.getPres(), index); + pdv.setFloat(PPCC_HGHT, sl.getHght(), index); + pdv.setFloat(PPCC_TEMP, sl.getTemp(), index); + pdv.setFloat(PPCC_DWPT, sl.getDwpt(), index); + pdv.setFloat(PPCC_DRCT, sl.getDrct(), index); + pdv.setFloat(PPCC_SPED, sl.getSped(), index); + index++; + + } + } + pdv.setInt("numPPCC", index); + } + break; - } - } - pdv.setInt ("numPPCC", index); - } - break; - case PPDD: - index = 0; - if (sls !=null ) { - while (sls.hasNext()) { - NcUairObsLevels sl = sls.next(); - if ( sl.getHght() > 0 && index < maxSigWindLevel ) { - pdv.setFloat(PPDD_HGHT, sl.getHght(), index); - pdv.setFloat(PPDD_DRCT, sl.getDrct(), index); - pdv.setFloat(PPDD_SPED, sl.getSped(), index); - index++; - } + index = 0; + if (sls != null) { + while (sls.hasNext()) { + NcUairObsLevels sl = sls.next(); + if (sl.getHght() > 0 && index < maxSigWindLevel) { + pdv.setFloat(PPDD_HGHT, sl.getHght(), index); + pdv.setFloat(PPDD_DRCT, sl.getDrct(), index); + pdv.setFloat(PPDD_SPED, sl.getSped(), index); + index++; + } - } - pdv.setInt ("numPPDD", index); - } + } + pdv.setInt("numPPDD", index); + } } - } - + } - if ( record.getTropopause () != null ) { - Iterator trops = record.getTropopause().iterator(); - index = 0; - if (trops != null) { - while (trops.hasNext()) { - NcUairTropopause trop = trops.next(); - if ( trop.getPres() > 0 && index < maxTropLevel ) { - pdv.setFloat(TROP_PRES, trop.getPres(), index); - pdv.setFloat(TROP_TEMP, trop.getTemp(), index); - pdv.setFloat(TROP_DWPT, trop.getDwpt(), index); - pdv.setFloat(TROP_DRCT, trop.getDrct(), index); - pdv.setFloat(TROP_SPED, trop.getSped(), index); - index++; - } - } - pdv.setInt ("numTrop", index); - } - } + if (record.getTropopause() != null) { + Iterator trops = record.getTropopause() + .iterator(); + index = 0; + if (trops != null) { + while (trops.hasNext()) { + NcUairTropopause trop = trops.next(); + if (trop.getPres() > 0 && index < maxTropLevel) { + pdv.setFloat(TROP_PRES, trop.getPres(), index); + pdv.setFloat(TROP_TEMP, trop.getTemp(), index); + pdv.setFloat(TROP_DWPT, trop.getDwpt(), index); + pdv.setFloat(TROP_DRCT, trop.getDrct(), index); + pdv.setFloat(TROP_SPED, trop.getSped(), index); + index++; + } + } + pdv.setInt("numTrop", index); + } + } - if (record.getMaxWind() != null ) { - Iterator wmaxs = record.getMaxWind().iterator(); - index = 0; - if (wmaxs != null) { - while (wmaxs.hasNext()) { - NcUairMaxWind wmax = wmaxs.next(); - if ( wmax.getPres() > 0 && index < maxWmaxLevel ) { - pdv.setFloat(WMAX_PRES, wmax.getPres(), index); - pdv.setFloat(WMAX_DRCT, wmax.getDrct(), index); - pdv.setFloat(WMAX_SPED, wmax.getSped(), index); - pdv.setFloat(WMAX_LO_SHEAR, wmax.getLoShear(), index); - pdv.setFloat(WMAX_HI_SHEAR, wmax.getHiShear(), index); - index++; - } - } - pdv.setInt ("numWmax", index); - } - } + if (record.getMaxWind() != null) { + Iterator wmaxs = record.getMaxWind().iterator(); + index = 0; + if (wmaxs != null) { + while (wmaxs.hasNext()) { + NcUairMaxWind wmax = wmaxs.next(); + if (wmax.getPres() > 0 && index < maxWmaxLevel) { + pdv.setFloat(WMAX_PRES, wmax.getPres(), index); + pdv.setFloat(WMAX_DRCT, wmax.getDrct(), index); + pdv.setFloat(WMAX_SPED, wmax.getSped(), index); + pdv.setFloat(WMAX_LO_SHEAR, wmax.getLoShear(), index); + pdv.setFloat(WMAX_HI_SHEAR, wmax.getHiShear(), index); + index++; + } + } + pdv.setInt("numWmax", index); + } + } - if (record.getLiftedIndex() != null) { - Iterator miscs = record.getLiftedIndex().iterator(); - index = 0; - if ( miscs != null) { - while (miscs.hasNext()) { - NcUairLiftedIndex misc = miscs.next(); - if ( index < maxMiscLevel ) { - if ( record.getDataType().equals("TTAA") ) { - pdv.setFloat(TTAA_LIFT, misc.getLiTemp(), index); - pdv.setFloat(TTAA_LO_MEAN_DRCT, misc.getLoDrct(), index); - pdv.setFloat(TTAA_LO_MEAN_SPED, misc.getLoSped(), index); - pdv.setFloat(TTAA_HI_MEAN_DRCT, misc.getHiDrct(), index); - pdv.setFloat(TTAA_HI_MEAN_SPED, misc.getHiSped(), index); - } else { - pdv.setFloat(TTBB_LIFT, misc.getLiTemp(), index); - pdv.setFloat(TTBB_LO_MEAN_DRCT, misc.getLoDrct(), index); - pdv.setFloat(TTBB_LO_MEAN_SPED, misc.getLoSped(), index); - pdv.setFloat(TTBB_HI_MEAN_DRCT, misc.getHiDrct(), index); - pdv.setFloat(TTBB_HI_MEAN_SPED, misc.getHiSped(), index); - } - index++; - } - } - if ( record.getDataType().equals ("TTAA")) { - pdv.setInt ("numMiscTTAA", index); - } else { - pdv.setInt ("numMiscTTBB", index); - } - } - } - return pdv; + if (record.getLiftedIndex() != null) { + Iterator miscs = record.getLiftedIndex() + .iterator(); + index = 0; + if (miscs != null) { + while (miscs.hasNext()) { + NcUairLiftedIndex misc = miscs.next(); + if (index < maxMiscLevel) { + if (record.getDataType().equals("TTAA")) { + pdv.setFloat(TTAA_LIFT, misc.getLiTemp(), index); + pdv.setFloat(TTAA_LO_MEAN_DRCT, misc.getLoDrct(), + index); + pdv.setFloat(TTAA_LO_MEAN_SPED, misc.getLoSped(), + index); + pdv.setFloat(TTAA_HI_MEAN_DRCT, misc.getHiDrct(), + index); + pdv.setFloat(TTAA_HI_MEAN_SPED, misc.getHiSped(), + index); + } else { + pdv.setFloat(TTBB_LIFT, misc.getLiTemp(), index); + pdv.setFloat(TTBB_LO_MEAN_DRCT, misc.getLoDrct(), + index); + pdv.setFloat(TTBB_LO_MEAN_SPED, misc.getLoSped(), + index); + pdv.setFloat(TTBB_HI_MEAN_DRCT, misc.getHiDrct(), + index); + pdv.setFloat(TTBB_HI_MEAN_SPED, misc.getHiSped(), + index); + } + index++; + } + } + if (record.getDataType().equals("TTAA")) { + pdv.setInt("numMiscTTAA", index); + } else { + pdv.setInt("numMiscTTBB", index); + } + } + } + return pdv; } } \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.ncuair/src/gov/noaa/nws/ncep/common/dataplugin/ncuair/dao/NcUairToRecord.java b/ncep/gov.noaa.nws.ncep.common.dataplugin.ncuair/src/gov/noaa/nws/ncep/common/dataplugin/ncuair/dao/NcUairToRecord.java index 6e0b649fb2..ce5912856b 100644 --- a/ncep/gov.noaa.nws.ncep.common.dataplugin.ncuair/src/gov/noaa/nws/ncep/common/dataplugin/ncuair/dao/NcUairToRecord.java +++ b/ncep/gov.noaa.nws.ncep.common.dataplugin.ncuair/src/gov/noaa/nws/ncep/common/dataplugin/ncuair/dao/NcUairToRecord.java @@ -13,8 +13,8 @@ * 6/2/2011 Chin Chen Fixed bugs and reorganize code * 09/2011 457 S. Gurung Renamed H5 to Nc and h5 to nc * 10/2011 S. Gurung Added changes related to getting stid/lat/lon/elev - * from database instead of snstns.xml file - * + * from database instead of snstns.xml file + * 6/2014 T.Lee Added support XXAA, XXBB, XXCC, XXDD * * * This code has been developed by the SIB for use in the AWIPS2 system. @@ -24,6 +24,12 @@ package gov.noaa.nws.ncep.common.dataplugin.ncuair.dao; +import gov.noaa.nws.ncep.common.dataplugin.ncuair.NcUairLiftedIndex; +import gov.noaa.nws.ncep.common.dataplugin.ncuair.NcUairMaxWind; +import gov.noaa.nws.ncep.common.dataplugin.ncuair.NcUairObsLevels; +import gov.noaa.nws.ncep.common.dataplugin.ncuair.NcUairRecord; +import gov.noaa.nws.ncep.common.dataplugin.ncuair.NcUairTropopause; + import java.util.ArrayList; import java.util.List; import java.util.Set; @@ -36,16 +42,11 @@ import com.raytheon.uf.common.pointdata.PointDataView; import com.raytheon.uf.common.pointdata.spatial.SurfaceObsLocation; import com.raytheon.uf.edex.decodertools.time.TimeTools; -import gov.noaa.nws.ncep.common.dataplugin.ncuair.NcUairLiftedIndex; -import gov.noaa.nws.ncep.common.dataplugin.ncuair.NcUairMaxWind; -import gov.noaa.nws.ncep.common.dataplugin.ncuair.NcUairObsLevels; -import gov.noaa.nws.ncep.common.dataplugin.ncuair.NcUairTropopause; -import gov.noaa.nws.ncep.common.dataplugin.ncuair.NcUairRecord; - public class NcUairToRecord { /** The logger */ private static Log logger = LogFactory.getLog(NcUairToRecord.class); + public static final String HDR_PARAMS_LIST; static { StringBuffer sb = new StringBuffer(); @@ -59,14 +60,14 @@ public class NcUairToRecord { sb.append("ISSUETIME,"); sb.append("OBSTIME,"); sb.append("SYNOPTIME,"); - sb.append("REPORTTYPE,"); + sb.append("REPORTTYPE,"); sb.append("DATATYPE,"); - sb.append("CORR,"); + sb.append("CORR,"); sb.append("NIL,"); sb.append("UTC"); HDR_PARAMS_LIST = sb.toString(); } - + public static final String MAN_PARAMS_LIST; static { StringBuffer sb = new StringBuffer(); @@ -78,12 +79,12 @@ public class NcUairToRecord { sb.append("TTAA_DRCT,"); sb.append("TTAA_SPED,"); sb.append("TTAA_HGHT,"); - //------------------------- + // ------------------------- sb.append("numTTBB,"); sb.append("TTBB_PRES,"); sb.append("TTBB_TEMP,"); sb.append("TTBB_DWPT,"); - //-------------------------- + // -------------------------- sb.append("numTTCC,"); sb.append("TTCC_PRES,"); sb.append("TTCC_TEMP,"); @@ -91,12 +92,12 @@ public class NcUairToRecord { sb.append("TTCC_DRCT,"); sb.append("TTCC_SPED,"); sb.append("TTCC_HGHT,"); - //------------------------- + // ------------------------- sb.append("numTTDD,"); sb.append("TTDD_PRES,"); sb.append("TTDD_TEMP,"); sb.append("TTDD_DWPT,"); - //------------------------- + // ------------------------- sb.append("numPPAA,"); sb.append("PPAA_PRES,"); sb.append("PPAA_TEMP,"); @@ -104,12 +105,12 @@ public class NcUairToRecord { sb.append("PPAA_DRCT,"); sb.append("PPAA_SPED,"); sb.append("PPAA_HGHT,"); - //------------------------- + // ------------------------- sb.append("numPPBB,"); sb.append("PPBB_DRCT,"); sb.append("PPBB_SPED,"); sb.append("PPBB_HGHT,"); - //------------------------- + // ------------------------- sb.append("numPPCC,"); sb.append("PPCC_PRES,"); sb.append("PPCC_TEMP,"); @@ -117,345 +118,372 @@ public class NcUairToRecord { sb.append("PPCC_DRCT,"); sb.append("PPCC_SPED,"); sb.append("PPCC_HGHT,"); - //------------------------- + // ------------------------- sb.append("numPPDD,"); sb.append("PPDD_DRCT,"); sb.append("PPDD_SPED,"); sb.append("PPDD_HGHT,"); - //------------------------- + // ------------------------- sb.append("numTrop,"); sb.append("TROP_PRES,"); sb.append("TROP_TEMP,"); sb.append("TROP_DWPT,"); sb.append("TROP_DRCT,"); sb.append("TROP_SPED,"); - //------------------------- + // ------------------------- sb.append("numWmax,"); sb.append("WMAX_PRES,"); sb.append("WMAX_DRCT,"); sb.append("WMAX_SPED,"); sb.append("WMAX_LO_SHEAR,"); sb.append("WMAX_HI_SHEAR,"); - //------------------------- + // ------------------------- sb.append("numMiscTTAA,"); sb.append("TTAA_LIFT,"); sb.append("TTAA_LO_MEAN_DRCT,"); sb.append("TTAA_LO_MEAN_SPED,"); sb.append("TTAA_HI_MEAN_DRCT,"); sb.append("TTAA_HI_MEAN_SPED,"); - //------------------------- + // ------------------------- sb.append("numMiscTTBB,"); sb.append("TTBB_LIFT,"); sb.append("TTBB_LO_MEAN_DRCT,"); sb.append("TTBB_LO_MEAN_SPED,"); sb.append("TTBB_HI_MEAN_DRCT,"); - sb.append("TTBB_HI_MEAN_SPED"); - //------------------------- + sb.append("TTBB_HI_MEAN_SPED,"); + // ------------------------- + sb.append("numXXAA,"); + sb.append("XXAA_PRES,"); + sb.append("XXAA_TEMP,"); + sb.append("XXAA_DWPT,"); + sb.append("XXAA_DRCT,"); + sb.append("XXAA_SPED,"); + sb.append("XXAA_HGHT,"); + // ------------------------- + sb.append("numXXBB,"); + sb.append("XXBB_PRES,"); + sb.append("XXBB_TEMP,"); + sb.append("XXBB_DWPT,"); + // -------------------------- + sb.append("numXXCC,"); + sb.append("XXCC_PRES,"); + sb.append("XXCC_TEMP,"); + sb.append("XXCC_DWPT,"); + sb.append("XXCC_DRCT,"); + sb.append("XXCC_SPED,"); + sb.append("XXCC_HGHT,"); + // ------------------------- + sb.append("numXXDD,"); + sb.append("XXDD_PRES,"); + sb.append("XXDD_TEMP,"); + sb.append("XXDD_DWPT"); MAN_PARAMS_LIST = sb.toString(); } - //static int count=0; + + // static int count=0; private static NcUairRecord getNcUairRecord(PointDataView pdv) { NcUairRecord record = null; - //count++; + // count++; if (pdv != null) { - Set parameters = pdv.getContainer().getParameters(); - //for(String str: parameters){ - // System.out.println("record "+ count+" H5 uair parameter:" + str); - //} + Set parameters = pdv.getContainer().getParameters(); + // for(String str: parameters){ + // System.out.println("record "+ count+" H5 uair parameter:" + str); + // } if (parameters.contains("DATAURI")) { - String uri = pdv.getString("DATAURI"); - logger.debug("URI = " + uri); - record = new NcUairRecord(uri); + String uri = pdv.getString("DATAURI"); + logger.debug("URI = " + uri); + record = new NcUairRecord(uri); + } else { + // System.out.println("no data uri"); + record = new NcUairRecord(); } - else{ - //System.out.println("no data uri"); - record = new NcUairRecord(); - } - + if (parameters.contains("UTC")) { - record.setUTC(pdv.getInt("UTC")); + record.setUTC(pdv.getInt("UTC")); } if (parameters.contains("OBSTIME")) { - long vt = pdv.getNumber("OBSTIME").longValue(); - record.setObsTime(TimeTools.newCalendar(vt)); + long vt = pdv.getNumber("OBSTIME").longValue(); + record.setObsTime(TimeTools.newCalendar(vt)); } if (parameters.contains("ISSUETIME")) { - long vt = pdv.getNumber("ISSUETIME").longValue(); - record.setIssueTime(TimeTools.newCalendar(vt)); + long vt = pdv.getNumber("ISSUETIME").longValue(); + record.setIssueTime(TimeTools.newCalendar(vt)); } if (parameters.contains("SYNOPTIME")) { - long vt = pdv.getNumber("SYNOPTIME").longValue(); - record.setSynopticTime(TimeTools.newCalendar(vt)); + long vt = pdv.getNumber("SYNOPTIME").longValue(); + record.setSynopticTime(TimeTools.newCalendar(vt)); } - if (parameters.contains("WMOHEADER")) - record.setWmoHeader(pdv.getString("WMOHEADER")); - if (parameters.contains("REPORTTYPE")) - record.setReportType(pdv.getString("REPORTTYPE")); - if (parameters.contains("DATATYPE")) - record.setDataType(pdv.getString("DATATYPE")); - if (parameters.contains("CORR")) - record.setCorr(pdv.getString("CORR")); - if (parameters.contains("STNUM")) - record.setStnum(pdv.getString("STNUM")); - + if (parameters.contains("WMOHEADER")) + record.setWmoHeader(pdv.getString("WMOHEADER")); + if (parameters.contains("REPORTTYPE")) + record.setReportType(pdv.getString("REPORTTYPE")); + if (parameters.contains("DATATYPE")) + record.setDataType(pdv.getString("DATATYPE")); + if (parameters.contains("CORR")) + record.setCorr(pdv.getString("CORR")); + if (parameters.contains("STNUM")) + record.setStnum(pdv.getString("STNUM")); + SurfaceObsLocation location = new SurfaceObsLocation(); - int elev = pdv.getNumber("ELEVATION").intValue(); + int elev = pdv.getNumber("ELEVATION").intValue(); location.setElevation(elev); double lat = pdv.getNumber("LATITUDE").doubleValue(); double lon = pdv.getNumber("LONGITUDE").doubleValue(); location.assignLocation(lat, lon); String sta = pdv.getString("STATIONID"); location.setStationId(sta); - record.setLocation(location); + record.setLocation(location); } return record; } + private static NcUairRecord getTTAA(PointDataView pdv, NcUairRecord record) { - NcUairObsLevels obslevels; + NcUairObsLevels obslevels; - /* - * Add TTAA data - */ - if(record != null) { - Set parameters = pdv.getContainer().getParameters(); - Number[] pres, hght, temp, dwpt, drct,sped; - if (parameters.contains("numTTAA")) { - Number numTTAA = pdv.getInt("numTTAA"); - if (numTTAA != null) { - //System.out.println("numTTAA="+numTTAA); - pres = pdv.getNumberAllLevels("TTAA_PRES"); - hght = pdv.getNumberAllLevels("TTAA_HGHT"); - temp = pdv.getNumberAllLevels("TTAA_TEMP"); - dwpt = pdv.getNumberAllLevels("TTAA_DWPT"); - drct = pdv.getNumberAllLevels("TTAA_DRCT"); - sped = pdv.getNumberAllLevels("TTAA_SPED"); + /* + * Add TTAA data + */ + if (record != null) { + Set parameters = pdv.getContainer().getParameters(); + Number[] pres, hght, temp, dwpt, drct, sped; + if (parameters.contains("numTTAA")) { + Number numTTAA = pdv.getInt("numTTAA"); + if (numTTAA != null) { + // System.out.println("numTTAA="+numTTAA); + pres = pdv.getNumberAllLevels("TTAA_PRES"); + hght = pdv.getNumberAllLevels("TTAA_HGHT"); + temp = pdv.getNumberAllLevels("TTAA_TEMP"); + dwpt = pdv.getNumberAllLevels("TTAA_DWPT"); + drct = pdv.getNumberAllLevels("TTAA_DRCT"); + sped = pdv.getNumberAllLevels("TTAA_SPED"); + + for (int i = 0; i < numTTAA.intValue(); i++) { + obslevels = new NcUairObsLevels(); + obslevels.setPres(pres[i].floatValue()); + obslevels.setHght(hght[i].floatValue()); + obslevels.setTemp(temp[i].floatValue()); + obslevels.setDwpt(dwpt[i].floatValue()); + obslevels.setDrct(drct[i].floatValue()); + obslevels.setSped(sped[i].floatValue()); + record.addObsLevels(obslevels); + } + } + } + + /* + * Add lifted index + */ + if (parameters.contains("numMiscTTAA")) { + Number numMiscTTAA = pdv.getNumber("numMiscTTAA"); + if (numMiscTTAA != null) { + Number[] ttaa_lift, ttaa_lo_drct, ttaa_lo_sped, ttaa_hi_drct, ttaa_hi_sped; + ttaa_lift = pdv.getNumberAllLevels("TTAA_LIFT"); + ttaa_lo_drct = pdv.getNumberAllLevels("TTAA_LO_MEAN_DRCT"); + ttaa_lo_sped = pdv.getNumberAllLevels("TTAA_LO_MEAN_SPED"); + ttaa_hi_drct = pdv.getNumberAllLevels("TTAA_HI_MEAN_DRCT"); + ttaa_hi_sped = pdv.getNumberAllLevels("TTAA_HI_MEAN_SPED"); + for (int i = 0; i < numMiscTTAA.intValue(); i++) { + NcUairLiftedIndex liftedindex = new NcUairLiftedIndex(); + liftedindex.setLiTemp(ttaa_lift[i].floatValue()); + liftedindex.setLoDrct(ttaa_lo_drct[i].floatValue()); + liftedindex.setLoSped(ttaa_lo_sped[i].floatValue()); + liftedindex.setHiDrct(ttaa_hi_drct[i].floatValue()); + liftedindex.setHiSped(ttaa_hi_sped[i].floatValue()); + record.addLiftedIndex(liftedindex); + } + } + } - for (int i = 0; i < numTTAA.intValue(); i++) { - obslevels = new NcUairObsLevels(); - obslevels.setPres(pres[i].floatValue()); - obslevels.setHght(hght[i].floatValue()); - obslevels.setTemp(temp[i].floatValue()); - obslevels.setDwpt(dwpt[i].floatValue()); - obslevels.setDrct(drct[i].floatValue()); - obslevels.setSped(sped[i].floatValue()); - record.addObsLevels(obslevels); - } - } - } - - /* - * Add lifted index - */ - if (parameters.contains("numMiscTTAA")) { - Number numMiscTTAA = pdv.getNumber("numMiscTTAA"); - if (numMiscTTAA != null) { - Number[] ttaa_lift, ttaa_lo_drct, ttaa_lo_sped, ttaa_hi_drct, ttaa_hi_sped; - ttaa_lift = pdv.getNumberAllLevels("TTAA_LIFT"); - ttaa_lo_drct = pdv.getNumberAllLevels("TTAA_LO_MEAN_DRCT"); - ttaa_lo_sped = pdv.getNumberAllLevels("TTAA_LO_MEAN_SPED"); - ttaa_hi_drct = pdv.getNumberAllLevels("TTAA_HI_MEAN_DRCT"); - ttaa_hi_sped = pdv.getNumberAllLevels("TTAA_HI_MEAN_SPED"); - for (int i = 0; i < numMiscTTAA.intValue(); i++) { - NcUairLiftedIndex liftedindex = new NcUairLiftedIndex(); - liftedindex.setLiTemp(ttaa_lift[i].floatValue()); - liftedindex.setLoDrct(ttaa_lo_drct[i].floatValue()); - liftedindex.setLoSped(ttaa_lo_sped[i].floatValue()); - liftedindex.setHiDrct(ttaa_hi_drct[i].floatValue()); - liftedindex.setHiSped(ttaa_hi_sped[i].floatValue()); - record.addLiftedIndex(liftedindex); - } - } - } - /* * Add tropopause data - */ - if (parameters.contains("numTrop")) { - Number numTrop = pdv.getInt("numTrop"); - if (numTrop != null) { - //System.out.println("numTropA="+numTrop); - pres = pdv.getNumberAllLevels("TROP_PRES"); - temp = pdv.getNumberAllLevels("TROP_TEMP"); - dwpt = pdv.getNumberAllLevels("TROP_DWPT"); - drct = pdv.getNumberAllLevels("TROP_DRCT"); - sped = pdv.getNumberAllLevels("TROP_SPED"); - for (int i = 0; i < numTrop.intValue(); i++) { - NcUairTropopause trop = new NcUairTropopause(); - trop.setPres(pres[i].floatValue()); - trop.setTemp(temp[i].floatValue()); - trop.setDwpt(dwpt[i].floatValue()); - trop.setDrct(drct[i].floatValue()); - trop.setSped(sped[i].floatValue()); - record.addTropopause(trop); - } - } - } + */ + if (parameters.contains("numTrop")) { + Number numTrop = pdv.getInt("numTrop"); + if (numTrop != null) { + // System.out.println("numTropA="+numTrop); + pres = pdv.getNumberAllLevels("TROP_PRES"); + temp = pdv.getNumberAllLevels("TROP_TEMP"); + dwpt = pdv.getNumberAllLevels("TROP_DWPT"); + drct = pdv.getNumberAllLevels("TROP_DRCT"); + sped = pdv.getNumberAllLevels("TROP_SPED"); + for (int i = 0; i < numTrop.intValue(); i++) { + NcUairTropopause trop = new NcUairTropopause(); + trop.setPres(pres[i].floatValue()); + trop.setTemp(temp[i].floatValue()); + trop.setDwpt(dwpt[i].floatValue()); + trop.setDrct(drct[i].floatValue()); + trop.setSped(sped[i].floatValue()); + record.addTropopause(trop); + } + } + } /* * Add max wind data - */ - if (parameters.contains("numWmax")) { - Number numWmax = pdv.getInt("numWmax"); - if (numWmax != null) { - //System.out.println("numWmaxA="+numWmax); - Number[] lo_shear = pdv.getNumberAllLevels("WMAX_LO_SHEAR"); - Number[] hi_shear = pdv.getNumberAllLevels("WMAX_HI_SHEAR"); - pres = pdv.getNumberAllLevels("WMAX_PRES"); - drct = pdv.getNumberAllLevels("WMAX_DRCT"); - sped = pdv.getNumberAllLevels("WMAX_SPED"); + */ + if (parameters.contains("numWmax")) { + Number numWmax = pdv.getInt("numWmax"); + if (numWmax != null) { + // System.out.println("numWmaxA="+numWmax); + Number[] lo_shear = pdv.getNumberAllLevels("WMAX_LO_SHEAR"); + Number[] hi_shear = pdv.getNumberAllLevels("WMAX_HI_SHEAR"); + pres = pdv.getNumberAllLevels("WMAX_PRES"); + drct = pdv.getNumberAllLevels("WMAX_DRCT"); + sped = pdv.getNumberAllLevels("WMAX_SPED"); - for (int i = 0; i < numWmax.intValue(); i++) { - NcUairMaxWind wmax = new NcUairMaxWind(); - wmax.setPres(pres[i].floatValue()); - wmax.setDrct(drct[i].floatValue()); - wmax.setSped(sped[i].floatValue()); - wmax.setHiShear(hi_shear[i].floatValue()); - wmax.setLoShear(lo_shear[i].floatValue()); - record.addMaxWind(wmax); - } - } - } + for (int i = 0; i < numWmax.intValue(); i++) { + NcUairMaxWind wmax = new NcUairMaxWind(); + wmax.setPres(pres[i].floatValue()); + wmax.setDrct(drct[i].floatValue()); + wmax.setSped(sped[i].floatValue()); + wmax.setHiShear(hi_shear[i].floatValue()); + wmax.setLoShear(lo_shear[i].floatValue()); + record.addMaxWind(wmax); + } + } + } } return record; } private static NcUairRecord getTTCC(PointDataView pdv, NcUairRecord record) { - if(record != null) { - Set parameters = pdv.getContainer().getParameters(); - Number[] pres, hght, temp, dwpt, drct,sped; - if (parameters.contains("numTTCC")) { - Number numTTCC = pdv.getInt("numTTCC"); - if (numTTCC != null) { - //System.out.println("numTTCC="+numTTCC); - NcUairObsLevels obslevels; - pres = pdv.getNumberAllLevels("TTCC_PRES"); - hght = pdv.getNumberAllLevels("TTCC_HGHT"); - temp = pdv.getNumberAllLevels("TTCC_TEMP"); - dwpt = pdv.getNumberAllLevels("TTCC_DWPT"); - drct = pdv.getNumberAllLevels("TTCC_DRCT"); - sped = pdv.getNumberAllLevels("TTCC_SPED"); - for (int i = 0; i < numTTCC.intValue(); i++) { - obslevels = new NcUairObsLevels(); - obslevels.setPres(pres[i].floatValue()); - obslevels.setHght(hght[i].floatValue()); - obslevels.setTemp(temp[i].floatValue()); - obslevels.setDwpt(dwpt[i].floatValue()); - obslevels.setDrct(drct[i].floatValue()); - obslevels.setSped(sped[i].floatValue()); - record.addObsLevels(obslevels); - } - } - } - + if (record != null) { + Set parameters = pdv.getContainer().getParameters(); + Number[] pres, hght, temp, dwpt, drct, sped; + if (parameters.contains("numTTCC")) { + Number numTTCC = pdv.getInt("numTTCC"); + if (numTTCC != null) { + // System.out.println("numTTCC="+numTTCC); + NcUairObsLevels obslevels; + pres = pdv.getNumberAllLevels("TTCC_PRES"); + hght = pdv.getNumberAllLevels("TTCC_HGHT"); + temp = pdv.getNumberAllLevels("TTCC_TEMP"); + dwpt = pdv.getNumberAllLevels("TTCC_DWPT"); + drct = pdv.getNumberAllLevels("TTCC_DRCT"); + sped = pdv.getNumberAllLevels("TTCC_SPED"); + for (int i = 0; i < numTTCC.intValue(); i++) { + obslevels = new NcUairObsLevels(); + obslevels.setPres(pres[i].floatValue()); + obslevels.setHght(hght[i].floatValue()); + obslevels.setTemp(temp[i].floatValue()); + obslevels.setDwpt(dwpt[i].floatValue()); + obslevels.setDrct(drct[i].floatValue()); + obslevels.setSped(sped[i].floatValue()); + record.addObsLevels(obslevels); + } + } + } + /* * Add tropopause data - */ - if (parameters.contains("numTrop")) { - Number numTrop = pdv.getInt("numTrop"); - if (numTrop != null) { - //System.out.println("numTropC="+numTrop); - pres = pdv.getNumberAllLevels("TROP_PRES"); - temp = pdv.getNumberAllLevels("TROP_TEMP"); - dwpt = pdv.getNumberAllLevels("TROP_DWPT"); - drct = pdv.getNumberAllLevels("TROP_DRCT"); - sped = pdv.getNumberAllLevels("TROP_SPED"); - for (int i = 0; i < numTrop.intValue(); i++) { - NcUairTropopause trop = new NcUairTropopause(); - trop.setPres(pres[i].floatValue()); - trop.setTemp(temp[i].floatValue()); - trop.setDwpt(dwpt[i].floatValue()); - trop.setDrct(drct[i].floatValue()); - trop.setSped(sped[i].floatValue()); - record.addTropopause(trop); - } - } - } + */ + if (parameters.contains("numTrop")) { + Number numTrop = pdv.getInt("numTrop"); + if (numTrop != null) { + // System.out.println("numTropC="+numTrop); + pres = pdv.getNumberAllLevels("TROP_PRES"); + temp = pdv.getNumberAllLevels("TROP_TEMP"); + dwpt = pdv.getNumberAllLevels("TROP_DWPT"); + drct = pdv.getNumberAllLevels("TROP_DRCT"); + sped = pdv.getNumberAllLevels("TROP_SPED"); + for (int i = 0; i < numTrop.intValue(); i++) { + NcUairTropopause trop = new NcUairTropopause(); + trop.setPres(pres[i].floatValue()); + trop.setTemp(temp[i].floatValue()); + trop.setDwpt(dwpt[i].floatValue()); + trop.setDrct(drct[i].floatValue()); + trop.setSped(sped[i].floatValue()); + record.addTropopause(trop); + } + } + } /* * Add max wind data - */ - if (parameters.contains("numWmax")) { - Number numWmax = pdv.getInt("numWmax"); - if (numWmax != null) { - //System.out.println("numWmaxC="+numWmax); - Number[] lo_shear = pdv.getNumberAllLevels("WMAX_LO_SHEAR"); - Number[] hi_shear = pdv.getNumberAllLevels("WMAX_HI_SHEAR"); - pres = pdv.getNumberAllLevels("WMAX_PRES"); - drct = pdv.getNumberAllLevels("WMAX_DRCT"); - sped = pdv.getNumberAllLevels("WMAX_SPED"); + */ + if (parameters.contains("numWmax")) { + Number numWmax = pdv.getInt("numWmax"); + if (numWmax != null) { + // System.out.println("numWmaxC="+numWmax); + Number[] lo_shear = pdv.getNumberAllLevels("WMAX_LO_SHEAR"); + Number[] hi_shear = pdv.getNumberAllLevels("WMAX_HI_SHEAR"); + pres = pdv.getNumberAllLevels("WMAX_PRES"); + drct = pdv.getNumberAllLevels("WMAX_DRCT"); + sped = pdv.getNumberAllLevels("WMAX_SPED"); - for (int i = 0; i < numWmax.intValue(); i++) { - NcUairMaxWind wmax = new NcUairMaxWind(); - wmax.setPres(pres[i].floatValue()); - wmax.setDrct(drct[i].floatValue()); - wmax.setSped(sped[i].floatValue()); - wmax.setHiShear(hi_shear[i].floatValue()); - wmax.setLoShear(lo_shear[i].floatValue()); - record.addMaxWind(wmax); - } - } - } - } + for (int i = 0; i < numWmax.intValue(); i++) { + NcUairMaxWind wmax = new NcUairMaxWind(); + wmax.setPres(pres[i].floatValue()); + wmax.setDrct(drct[i].floatValue()); + wmax.setSped(sped[i].floatValue()); + wmax.setHiShear(hi_shear[i].floatValue()); + wmax.setLoShear(lo_shear[i].floatValue()); + record.addMaxWind(wmax); + } + } + } + } return record; } - + /** * @param pdv * @param record * @return */ private static NcUairRecord getPPBB(PointDataView pdv, NcUairRecord record) { - if (record != null) { - Set parameters = pdv.getContainer().getParameters(); - if (parameters.contains("numPPBB")) { - Number numPPBB = pdv.getInt("numPPBB"); - if (numPPBB != null){ - //System.out.println("numPPBB="+numPPBB); - Number[] drct, hght, sped; - if (record.getDataType().equals("PPBB")) { - drct = pdv.getNumberAllLevels("PPBB_DRCT"); - hght = pdv.getNumberAllLevels("PPBB_HGHT"); - sped = pdv.getNumberAllLevels("PPBB_SPED"); - for (int i = 0; i < numPPBB.intValue(); i++) { - NcUairObsLevels obslevels = new NcUairObsLevels(); - obslevels.setDrct(drct[i].floatValue()); - obslevels.setHght(hght[i].floatValue()); - obslevels.setSped(sped[i].floatValue()); - record.addObsLevels(obslevels); - } - } - } - } - } + if (record != null) { + Set parameters = pdv.getContainer().getParameters(); + if (parameters.contains("numPPBB")) { + Number numPPBB = pdv.getInt("numPPBB"); + if (numPPBB != null) { + // System.out.println("numPPBB="+numPPBB); + Number[] drct, hght, sped; + if (record.getDataType().equals("PPBB")) { + drct = pdv.getNumberAllLevels("PPBB_DRCT"); + hght = pdv.getNumberAllLevels("PPBB_HGHT"); + sped = pdv.getNumberAllLevels("PPBB_SPED"); + for (int i = 0; i < numPPBB.intValue(); i++) { + NcUairObsLevels obslevels = new NcUairObsLevels(); + obslevels.setDrct(drct[i].floatValue()); + obslevels.setHght(hght[i].floatValue()); + obslevels.setSped(sped[i].floatValue()); + record.addObsLevels(obslevels); + } + } + } + } + } return record; } + /** * @param pdv * @param record * @return */ private static NcUairRecord getPPDD(PointDataView pdv, NcUairRecord record) { - if (record != null) { - Set parameters = pdv.getContainer().getParameters(); - if (parameters.contains("numPPDD")) { - Number numPPDD = pdv.getInt("numPPDD"); - if (numPPDD != null){ - Number[] drct, hght, sped; - if (record.getDataType().equals("PPDD")) { - drct = pdv.getNumberAllLevels("PPDD_DRCT"); - hght = pdv.getNumberAllLevels("PPDD_HGHT"); - sped = pdv.getNumberAllLevels("PPDD_SPED"); - for (int i = 0; i < numPPDD.intValue(); i++) { - NcUairObsLevels obslevels = new NcUairObsLevels(); - obslevels.setDrct(drct[i].floatValue()); - obslevels.setHght(hght[i].floatValue()); - obslevels.setSped(sped[i].floatValue()); - record.addObsLevels(obslevels); - } - } - } - } - } + if (record != null) { + Set parameters = pdv.getContainer().getParameters(); + if (parameters.contains("numPPDD")) { + Number numPPDD = pdv.getInt("numPPDD"); + if (numPPDD != null) { + Number[] drct, hght, sped; + if (record.getDataType().equals("PPDD")) { + drct = pdv.getNumberAllLevels("PPDD_DRCT"); + hght = pdv.getNumberAllLevels("PPDD_HGHT"); + sped = pdv.getNumberAllLevels("PPDD_SPED"); + for (int i = 0; i < numPPDD.intValue(); i++) { + NcUairObsLevels obslevels = new NcUairObsLevels(); + obslevels.setDrct(drct[i].floatValue()); + obslevels.setHght(hght[i].floatValue()); + obslevels.setSped(sped[i].floatValue()); + record.addObsLevels(obslevels); + } + } + } + } + } return record; } @@ -465,230 +493,483 @@ public class NcUairToRecord { * @return NcUairRecord */ private static NcUairRecord getPPAA(PointDataView pdv, NcUairRecord record) { - if (record != null) { - Set parameters = pdv.getContainer().getParameters(); - if (parameters.contains("numPPAA")) { - Number numPPAA = pdv.getInt("numPPAA"); - if (numPPAA != null){ - //System.out.println("numPPAA="+numPPAA); - Number[] pres, temp, dwpt, drct, sped, hght; - pres = pdv.getNumberAllLevels("PPAA_PRES"); - temp = pdv.getNumberAllLevels("PPAA_TEMP"); - dwpt = pdv.getNumberAllLevels("PPAA_DWPT"); - drct = pdv.getNumberAllLevels("PPAA_DRCT"); - sped = pdv.getNumberAllLevels("PPAA_SPED"); - hght = pdv.getNumberAllLevels("PPAA_HGHT"); - { - for (int i = 0; i < numPPAA.intValue(); i++) { - NcUairObsLevels obslevels = new NcUairObsLevels(); - obslevels.setPres(pres[i].floatValue()); - obslevels.setTemp(temp[i].floatValue()); - obslevels.setDwpt(dwpt[i].floatValue()); - obslevels.setDrct(drct[i].floatValue()); - obslevels.setSped(sped[i].floatValue()); - obslevels.setHght(hght[i].floatValue()); - record.addObsLevels(obslevels); - } - } - } - } - } - return record; + if (record != null) { + Set parameters = pdv.getContainer().getParameters(); + if (parameters.contains("numPPAA")) { + Number numPPAA = pdv.getInt("numPPAA"); + if (numPPAA != null) { + // System.out.println("numPPAA="+numPPAA); + Number[] pres, temp, dwpt, drct, sped, hght; + pres = pdv.getNumberAllLevels("PPAA_PRES"); + temp = pdv.getNumberAllLevels("PPAA_TEMP"); + dwpt = pdv.getNumberAllLevels("PPAA_DWPT"); + drct = pdv.getNumberAllLevels("PPAA_DRCT"); + sped = pdv.getNumberAllLevels("PPAA_SPED"); + hght = pdv.getNumberAllLevels("PPAA_HGHT"); + { + for (int i = 0; i < numPPAA.intValue(); i++) { + NcUairObsLevels obslevels = new NcUairObsLevels(); + obslevels.setPres(pres[i].floatValue()); + obslevels.setTemp(temp[i].floatValue()); + obslevels.setDwpt(dwpt[i].floatValue()); + obslevels.setDrct(drct[i].floatValue()); + obslevels.setSped(sped[i].floatValue()); + obslevels.setHght(hght[i].floatValue()); + record.addObsLevels(obslevels); + } + } + } + } + } + return record; } + /** * @param pdv * @param record * @return NcUairRecord */ private static NcUairRecord getPPCC(PointDataView pdv, NcUairRecord record) { - if (record != null) { - Set parameters = pdv.getContainer().getParameters(); - if (parameters.contains("numPPCC")) { - Number numPPCC = pdv.getInt("numPPCC"); - if (numPPCC != null){ - //System.out.println("numPPCC="+numPPCC); - Number[] pres, temp, dwpt, drct, sped, hght; - pres = pdv.getNumberAllLevels("PPCC_PRES"); - temp = pdv.getNumberAllLevels("PPCC_TEMP"); - dwpt = pdv.getNumberAllLevels("PPCC_DWPT"); - drct = pdv.getNumberAllLevels("PPCC_DRCT"); - sped = pdv.getNumberAllLevels("PPCC_SPED"); - hght = pdv.getNumberAllLevels("PPCC_HGHT"); - for (int i = 0; i < numPPCC.intValue(); i++) { - NcUairObsLevels obslevels = new NcUairObsLevels(); - obslevels.setPres(pres[i].floatValue()); - obslevels.setTemp(temp[i].floatValue()); - obslevels.setDwpt(dwpt[i].floatValue()); - obslevels.setDrct(drct[i].floatValue()); - obslevels.setSped(sped[i].floatValue()); - obslevels.setHght(hght[i].floatValue()); - record.addObsLevels(obslevels); - } - } - } - } - return record; + if (record != null) { + Set parameters = pdv.getContainer().getParameters(); + if (parameters.contains("numPPCC")) { + Number numPPCC = pdv.getInt("numPPCC"); + if (numPPCC != null) { + // System.out.println("numPPCC="+numPPCC); + Number[] pres, temp, dwpt, drct, sped, hght; + pres = pdv.getNumberAllLevels("PPCC_PRES"); + temp = pdv.getNumberAllLevels("PPCC_TEMP"); + dwpt = pdv.getNumberAllLevels("PPCC_DWPT"); + drct = pdv.getNumberAllLevels("PPCC_DRCT"); + sped = pdv.getNumberAllLevels("PPCC_SPED"); + hght = pdv.getNumberAllLevels("PPCC_HGHT"); + for (int i = 0; i < numPPCC.intValue(); i++) { + NcUairObsLevels obslevels = new NcUairObsLevels(); + obslevels.setPres(pres[i].floatValue()); + obslevels.setTemp(temp[i].floatValue()); + obslevels.setDwpt(dwpt[i].floatValue()); + obslevels.setDrct(drct[i].floatValue()); + obslevels.setSped(sped[i].floatValue()); + obslevels.setHght(hght[i].floatValue()); + record.addObsLevels(obslevels); + } + } + } + } + return record; } + private static NcUairRecord getTTDD(PointDataView pdv, NcUairRecord record) { - if (record != null) { - Set parameters = pdv.getContainer().getParameters(); - if (parameters.contains("numTTDD")) { - Number numTTDD = pdv.getInt("numTTDD"); - if (numTTDD != null) { - Number[] pres, temp, dwpt; - //System.out.println("numTTDD="+numTTDD); - pres = pdv.getNumberAllLevels("TTDD_PRES"); - temp = pdv.getNumberAllLevels("TTDD_TEMP"); - dwpt = pdv.getNumberAllLevels("TTDD_DWPT"); - for (int i = 0; i < numTTDD.intValue(); i++) { - NcUairObsLevels obslevels = new NcUairObsLevels(); - obslevels.setPres(pres[i].floatValue()); - obslevels.setTemp(temp[i].floatValue()); - obslevels.setDwpt(dwpt[i].floatValue()); - record.addObsLevels(obslevels); - } - } - } - } + if (record != null) { + Set parameters = pdv.getContainer().getParameters(); + if (parameters.contains("numTTDD")) { + Number numTTDD = pdv.getInt("numTTDD"); + if (numTTDD != null) { + Number[] pres, temp, dwpt; + // System.out.println("numTTDD="+numTTDD); + pres = pdv.getNumberAllLevels("TTDD_PRES"); + temp = pdv.getNumberAllLevels("TTDD_TEMP"); + dwpt = pdv.getNumberAllLevels("TTDD_DWPT"); + for (int i = 0; i < numTTDD.intValue(); i++) { + NcUairObsLevels obslevels = new NcUairObsLevels(); + obslevels.setPres(pres[i].floatValue()); + obslevels.setTemp(temp[i].floatValue()); + obslevels.setDwpt(dwpt[i].floatValue()); + record.addObsLevels(obslevels); + } + } + } + } return record; } private static NcUairRecord getTTBB(PointDataView pdv, NcUairRecord record) { if (record != null) { - Set parameters = pdv.getContainer().getParameters(); - if (parameters.contains("numTTBB")) { + Set parameters = pdv.getContainer().getParameters(); + if (parameters.contains("numTTBB")) { - Number numTTBB = pdv.getInt("numTTBB"); - if (numTTBB != null) { - //System.out.println("numTTBB="+numTTBB); - Number[] pres, temp, dwpt; - pres = pdv.getNumberAllLevels("TTBB_PRES"); - temp = pdv.getNumberAllLevels("TTBB_TEMP"); - dwpt = pdv.getNumberAllLevels("TTBB_DWPT"); + Number numTTBB = pdv.getInt("numTTBB"); + if (numTTBB != null) { + // System.out.println("numTTBB="+numTTBB); + Number[] pres, temp, dwpt; + pres = pdv.getNumberAllLevels("TTBB_PRES"); + temp = pdv.getNumberAllLevels("TTBB_TEMP"); + dwpt = pdv.getNumberAllLevels("TTBB_DWPT"); + for (int i = 0; i < numTTBB.intValue(); i++) { + NcUairObsLevels obslevels = new NcUairObsLevels(); + obslevels.setPres(pres[i].floatValue()); + obslevels.setTemp(temp[i].floatValue()); + obslevels.setDwpt(dwpt[i].floatValue()); + record.addObsLevels(obslevels); + } + } + } + /* + * Add lifted index + */ + if (parameters.contains("numMiscTTBB")) { + Number numMiscTTBB = pdv.getInt("numMiscTTBB"); + if (numMiscTTBB != null) { + Number[] ttbb_lift, ttbb_lo_drct, ttbb_lo_sped, ttbb_hi_drct, ttbb_hi_sped; - for (int i = 0; i < numTTBB.intValue(); i++) { - NcUairObsLevels obslevels = new NcUairObsLevels(); - obslevels.setPres(pres[i].floatValue()); - obslevels.setTemp(temp[i].floatValue()); - obslevels.setDwpt(dwpt[i].floatValue()); - record.addObsLevels(obslevels); - } - } - } - /* - * Add lifted index - */ - if (parameters.contains("numMiscTTBB")) { - Number numMiscTTBB = pdv.getInt("numMiscTTBB"); - if (numMiscTTBB != null) { - Number[] ttbb_lift, ttbb_lo_drct, ttbb_lo_sped, ttbb_hi_drct, ttbb_hi_sped; + ttbb_lift = pdv.getNumberAllLevels("TTBB_LIFT"); + ttbb_lo_drct = pdv.getNumberAllLevels("TTBB_LO_MEAN_DRCT"); + ttbb_lo_sped = pdv.getNumberAllLevels("TTBB_LO_MEAN_SPED"); + ttbb_hi_drct = pdv.getNumberAllLevels("TTBB_HI_MEAN_DRCT"); + ttbb_hi_sped = pdv.getNumberAllLevels("TTBB_HI_MEAN_SPED"); - ttbb_lift = pdv.getNumberAllLevels("TTBB_LIFT"); - ttbb_lo_drct = pdv.getNumberAllLevels("TTBB_LO_MEAN_DRCT"); - ttbb_lo_sped = pdv.getNumberAllLevels("TTBB_LO_MEAN_SPED"); - ttbb_hi_drct = pdv.getNumberAllLevels("TTBB_HI_MEAN_DRCT"); - ttbb_hi_sped = pdv.getNumberAllLevels("TTBB_HI_MEAN_SPED"); + for (int i = 0; i < numMiscTTBB.intValue(); i++) { + NcUairLiftedIndex liftedindex = new NcUairLiftedIndex(); + liftedindex.setLiTemp(ttbb_lift[i].floatValue()); + liftedindex.setLoDrct(ttbb_lo_drct[i].floatValue()); + liftedindex.setLoSped(ttbb_lo_sped[i].floatValue()); + liftedindex.setHiDrct(ttbb_hi_drct[i].floatValue()); + liftedindex.setHiSped(ttbb_hi_sped[i].floatValue()); + record.addLiftedIndex(liftedindex); + } - for (int i = 0; i < numMiscTTBB.intValue(); i++) { - NcUairLiftedIndex liftedindex = new NcUairLiftedIndex(); - liftedindex.setLiTemp(ttbb_lift[i].floatValue()); - liftedindex.setLoDrct(ttbb_lo_drct[i].floatValue()); - liftedindex.setLoSped(ttbb_lo_sped[i].floatValue()); - liftedindex.setHiDrct(ttbb_hi_drct[i].floatValue()); - liftedindex.setHiSped(ttbb_hi_sped[i].floatValue()); - record.addLiftedIndex(liftedindex); - } - - } - } + } + } } return record; } - - /** + + private static NcUairRecord getXXAA(PointDataView pdv, NcUairRecord record) { + NcUairObsLevels obslevels; + // System.out.println(" GetXXAA !!!!!!!"); + + /* + * Add XXAA data + */ + if (record != null) { + Set parameters = pdv.getContainer().getParameters(); + // for (String pam : parameters) + // System.out.println("parm=" + pam); + Number[] pres, hght, temp, dwpt, drct, sped; + if (parameters.contains("numXXAA")) { + Number numXXAA = pdv.getInt("numXXAA"); + if (numXXAA != null) { + // System.out.println("numXXAA=" + numXXAA); + pres = pdv.getNumberAllLevels("XXAA_PRES"); + hght = pdv.getNumberAllLevels("XXAA_HGHT"); + temp = pdv.getNumberAllLevels("XXAA_TEMP"); + dwpt = pdv.getNumberAllLevels("XXAA_DWPT"); + drct = pdv.getNumberAllLevels("XXAA_DRCT"); + sped = pdv.getNumberAllLevels("XXAA_SPED"); + + for (int i = 0; i < numXXAA.intValue(); i++) { + obslevels = new NcUairObsLevels(); + obslevels.setPres(pres[i].floatValue()); + obslevels.setHght(hght[i].floatValue()); + obslevels.setTemp(temp[i].floatValue()); + obslevels.setDwpt(dwpt[i].floatValue()); + obslevels.setDrct(drct[i].floatValue()); + obslevels.setSped(sped[i].floatValue()); + // System.out.println("level pres=" + + // obslevels.getPres()); + record.addObsLevels(obslevels); + } + } + } + + /* + * Add tropopause data + */ + if (parameters.contains("numTrop")) { + Number numTrop = pdv.getInt("numTrop"); + if (numTrop != null) { + // System.out.println("numTropA="+numTrop); + pres = pdv.getNumberAllLevels("TROP_PRES"); + temp = pdv.getNumberAllLevels("TROP_TEMP"); + dwpt = pdv.getNumberAllLevels("TROP_DWPT"); + drct = pdv.getNumberAllLevels("TROP_DRCT"); + sped = pdv.getNumberAllLevels("TROP_SPED"); + for (int i = 0; i < numTrop.intValue(); i++) { + NcUairTropopause trop = new NcUairTropopause(); + trop.setPres(pres[i].floatValue()); + trop.setTemp(temp[i].floatValue()); + trop.setDwpt(dwpt[i].floatValue()); + trop.setDrct(drct[i].floatValue()); + trop.setSped(sped[i].floatValue()); + record.addTropopause(trop); + } + } + } + + /* + * Add max wind data + */ + if (parameters.contains("numWmax")) { + Number numWmax = pdv.getInt("numWmax"); + if (numWmax != null) { + // System.out.println("numWmaxA="+numWmax); + Number[] lo_shear = pdv.getNumberAllLevels("WMAX_LO_SHEAR"); + Number[] hi_shear = pdv.getNumberAllLevels("WMAX_HI_SHEAR"); + pres = pdv.getNumberAllLevels("WMAX_PRES"); + drct = pdv.getNumberAllLevels("WMAX_DRCT"); + sped = pdv.getNumberAllLevels("WMAX_SPED"); + + for (int i = 0; i < numWmax.intValue(); i++) { + NcUairMaxWind wmax = new NcUairMaxWind(); + wmax.setPres(pres[i].floatValue()); + wmax.setDrct(drct[i].floatValue()); + wmax.setSped(sped[i].floatValue()); + wmax.setHiShear(hi_shear[i].floatValue()); + wmax.setLoShear(lo_shear[i].floatValue()); + record.addMaxWind(wmax); + } + } + } + } + if (record == null) { + System.out.println(" NcUairToRecord/ record is null!!!!!!!"); + } + return record; + } + + private static NcUairRecord getXXCC(PointDataView pdv, NcUairRecord record) { + if (record != null) { + Set parameters = pdv.getContainer().getParameters(); + Number[] pres, hght, temp, dwpt, drct, sped; + if (parameters.contains("numXXCC")) { + Number numXXCC = pdv.getInt("numXXCC"); + if (numXXCC != null) { + // System.out.println("numXXCC="+numXXCC); + NcUairObsLevels obslevels; + pres = pdv.getNumberAllLevels("XXCC_PRES"); + hght = pdv.getNumberAllLevels("XXCC_HGHT"); + temp = pdv.getNumberAllLevels("XXCC_TEMP"); + dwpt = pdv.getNumberAllLevels("XXCC_DWPT"); + drct = pdv.getNumberAllLevels("XXCC_DRCT"); + sped = pdv.getNumberAllLevels("XXCC_SPED"); + for (int i = 0; i < numXXCC.intValue(); i++) { + obslevels = new NcUairObsLevels(); + obslevels.setPres(pres[i].floatValue()); + obslevels.setHght(hght[i].floatValue()); + obslevels.setTemp(temp[i].floatValue()); + obslevels.setDwpt(dwpt[i].floatValue()); + obslevels.setDrct(drct[i].floatValue()); + obslevels.setSped(sped[i].floatValue()); + record.addObsLevels(obslevels); + } + } + } + + /* + * Add tropopause data + */ + if (parameters.contains("numTrop")) { + Number numTrop = pdv.getInt("numTrop"); + if (numTrop != null) { + // System.out.println("numTropC="+numTrop); + pres = pdv.getNumberAllLevels("TROP_PRES"); + temp = pdv.getNumberAllLevels("TROP_TEMP"); + dwpt = pdv.getNumberAllLevels("TROP_DWPT"); + drct = pdv.getNumberAllLevels("TROP_DRCT"); + sped = pdv.getNumberAllLevels("TROP_SPED"); + for (int i = 0; i < numTrop.intValue(); i++) { + NcUairTropopause trop = new NcUairTropopause(); + trop.setPres(pres[i].floatValue()); + trop.setTemp(temp[i].floatValue()); + trop.setDwpt(dwpt[i].floatValue()); + trop.setDrct(drct[i].floatValue()); + trop.setSped(sped[i].floatValue()); + record.addTropopause(trop); + } + } + } + + /* + * Add max wind data + */ + if (parameters.contains("numWmax")) { + Number numWmax = pdv.getInt("numWmax"); + if (numWmax != null) { + // System.out.println("numWmaxC="+numWmax); + Number[] lo_shear = pdv.getNumberAllLevels("WMAX_LO_SHEAR"); + Number[] hi_shear = pdv.getNumberAllLevels("WMAX_HI_SHEAR"); + pres = pdv.getNumberAllLevels("WMAX_PRES"); + drct = pdv.getNumberAllLevels("WMAX_DRCT"); + sped = pdv.getNumberAllLevels("WMAX_SPED"); + + for (int i = 0; i < numWmax.intValue(); i++) { + NcUairMaxWind wmax = new NcUairMaxWind(); + wmax.setPres(pres[i].floatValue()); + wmax.setDrct(drct[i].floatValue()); + wmax.setSped(sped[i].floatValue()); + wmax.setHiShear(hi_shear[i].floatValue()); + wmax.setLoShear(lo_shear[i].floatValue()); + record.addMaxWind(wmax); + } + } + } + } + return record; + } + + private static NcUairRecord getXXBB(PointDataView pdv, NcUairRecord record) { + if (record != null) { + Set parameters = pdv.getContainer().getParameters(); + if (parameters.contains("numXXBB")) { + + Number numXXBB = pdv.getInt("numXXBB"); + if (numXXBB != null) { + // System.out.println("numXXBB="+numXXBB); + Number[] pres, temp, dwpt; + pres = pdv.getNumberAllLevels("XXBB_PRES"); + temp = pdv.getNumberAllLevels("XXBB_TEMP"); + dwpt = pdv.getNumberAllLevels("XXBB_DWPT"); + + for (int i = 0; i < numXXBB.intValue(); i++) { + NcUairObsLevels obslevels = new NcUairObsLevels(); + obslevels.setPres(pres[i].floatValue()); + obslevels.setTemp(temp[i].floatValue()); + obslevels.setDwpt(dwpt[i].floatValue()); + record.addObsLevels(obslevels); + } + } + } + } + return record; + } + + private static NcUairRecord getXXDD(PointDataView pdv, NcUairRecord record) { + if (record != null) { + Set parameters = pdv.getContainer().getParameters(); + if (parameters.contains("numXXDD")) { + Number numXXDD = pdv.getInt("numXXDD"); + if (numXXDD != null) { + Number[] pres, temp, dwpt; + // System.out.println("numXXDD="+numXXDD); + pres = pdv.getNumberAllLevels("XXDD_PRES"); + temp = pdv.getNumberAllLevels("XXDD_TEMP"); + dwpt = pdv.getNumberAllLevels("XXDD_DWPT"); + for (int i = 0; i < numXXDD.intValue(); i++) { + NcUairObsLevels obslevels = new NcUairObsLevels(); + obslevels.setPres(pres[i].floatValue()); + obslevels.setTemp(temp[i].floatValue()); + obslevels.setDwpt(dwpt[i].floatValue()); + record.addObsLevels(obslevels); + } + } + } + } + return record; + } + + /** * @param container * @return */ - private enum DATATYPE {TTAA, TTBB, TTCC, TTDD, PPAA, PPBB, PPCC, PPDD, XXAA, XXBB, XXCC, XXDD, UUAA, UUBB, UUCC, UUDD}; - public static NcUairRecord [] toNcUairRecords(PointDataContainer container) { + private enum DATATYPE { + TTAA, TTBB, TTCC, TTDD, PPAA, PPBB, PPCC, PPDD, XXAA, XXBB, XXCC, XXDD, UUAA, UUBB, UUCC, UUDD + }; + + public static NcUairRecord[] toNcUairRecords(PointDataContainer container) { List records = new ArrayList(); container.setCurrentSz(container.getAllocatedSz()); for (int i = 0; i < container.getCurrentSz(); i++) { - PointDataView pdv = container.readRandom(i); - NcUairRecord record = getNcUairRecord(pdv); - if(record != null) { - switch(DATATYPE.valueOf(record.getDataType())) { - case TTAA: - record = getTTAA(pdv,record); - break; - case TTCC: - record = getTTCC(pdv,record); - break; - case TTBB: - record = getTTBB(pdv,record); - break; - case TTDD: - record = getTTDD(pdv,record); - break; - case PPAA: - record = getPPAA(pdv,record); - break; - case PPCC: - record = getPPCC(pdv,record); - break; - case PPBB: - record = getPPBB(pdv,record); - break; - case PPDD: - record = getPPDD(pdv,record); - break; - default: - continue; - } - records.add(record); - } + PointDataView pdv = container.readRandom(i); + NcUairRecord record = getNcUairRecord(pdv); + if (record != null) { + switch (DATATYPE.valueOf(record.getDataType())) { + case TTAA: + record = getTTAA(pdv, record); + break; + case TTCC: + record = getTTCC(pdv, record); + break; + case TTBB: + record = getTTBB(pdv, record); + break; + case TTDD: + record = getTTDD(pdv, record); + break; + case PPAA: + record = getPPAA(pdv, record); + break; + case PPCC: + record = getPPCC(pdv, record); + break; + case PPBB: + record = getPPBB(pdv, record); + break; + case PPDD: + record = getPPDD(pdv, record); + break; + case XXAA: + record = getXXAA(pdv, record); + break; + case XXCC: + record = getXXCC(pdv, record); + break; + case XXBB: + record = getXXBB(pdv, record); + break; + case XXDD: + record = getXXDD(pdv, record); + break; + default: + continue; + } + records.add(record); + } } return records.toArray(new NcUairRecord[records.size()]); } - public static List toNcUairRecordsList(PointDataContainer container) { + + public static List toNcUairRecordsList( + PointDataContainer container) { List records = new ArrayList(); container.setCurrentSz(container.getAllocatedSz()); for (int i = 0; i < container.getCurrentSz(); i++) { - PointDataView pdv = container.readRandom(i); - NcUairRecord record = getNcUairRecord(pdv); - if(record != null) { - switch(DATATYPE.valueOf(record.getDataType())) { - case TTAA: - record = getTTAA(pdv,record); - break; - case TTCC: - record = getTTCC(pdv,record); - break; - case TTBB: - record = getTTBB(pdv,record); - break; - case TTDD: - record = getTTDD(pdv,record); - break; - case PPAA: - record = getPPAA(pdv,record); - break; - case PPCC: - record = getPPCC(pdv,record); - break; - case PPBB: - record = getPPBB(pdv,record); - break; - case PPDD: - record = getPPDD(pdv,record); - break; - default: - continue; - } - records.add(record); - } + PointDataView pdv = container.readRandom(i); + NcUairRecord record = getNcUairRecord(pdv); + if (record != null) { + switch (DATATYPE.valueOf(record.getDataType())) { + case TTAA: + record = getTTAA(pdv, record); + break; + case TTCC: + record = getTTCC(pdv, record); + break; + case TTBB: + record = getTTBB(pdv, record); + break; + case TTDD: + record = getTTDD(pdv, record); + break; + case PPAA: + record = getPPAA(pdv, record); + break; + case PPCC: + record = getPPCC(pdv, record); + break; + case PPBB: + record = getPPBB(pdv, record); + break; + case PPDD: + record = getPPDD(pdv, record); + break; + case XXAA: + record = getXXAA(pdv, record); + break; + case XXCC: + record = getXXCC(pdv, record); + break; + case XXBB: + record = getXXBB(pdv, record); + break; + case XXDD: + record = getXXDD(pdv, record); + break; + default: + continue; + } + records.add(record); + } } return records; } diff --git a/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/common/metparameters/PressChange3Hr.java b/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/common/metparameters/PressChange3Hr.java index ad575b1d11..43b741fb0d 100644 --- a/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/common/metparameters/PressChange3Hr.java +++ b/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/common/metparameters/PressChange3Hr.java @@ -51,12 +51,26 @@ public class PressChange3Hr extends AbstractMetParameter implements javax.measur Number n = (Number) new Integer(ptsy.getStringValue()); Amount ptsyAmount = new Amount(n, Unit.ONE); Amount theP03CAmount = PRLibrary.prP03CAbsVal(p, ptsyAmount); + this.setAssociatedMetParam(copyDerivedPTSY(ptsy)); this.setValue(theP03CAmount); - } else { this.setValueToMissing(); } return this; } + + private PressureTendencySymbol copyDerivedPTSY(PressureTendencySymbol ptsy) { + + PressureTendencySymbol cptsy = new PressureTendencySymbol(); + + cptsy.setDataTime(ptsy.getDataTime()); + cptsy.setStringValue(ptsy.getStringValue()); + cptsy.setUnit(ptsy.getUnit()); + cptsy.setValidTime(ptsy.getValidTime()); + + return cptsy; + + } + } diff --git a/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/common/metparameters/PressureChange3HrAndTendency.java b/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/common/metparameters/PressureChange3HrAndTendency.java index 02bc4b320c..08f66d1ffa 100644 --- a/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/common/metparameters/PressureChange3HrAndTendency.java +++ b/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/common/metparameters/PressureChange3HrAndTendency.java @@ -38,17 +38,8 @@ public class PressureChange3HrAndTendency extends AbstractMetParameter implement Number n = (Number) new Integer(ptsy.getStringValue()); Amount ptsyAmount = new Amount(n, Unit.ONE); Amount theP03CAmount = PRLibrary.prP03CAbsVal(p, ptsyAmount); - - this.setValue(theP03CAmount); this.setAssociatedMetParam(copyDerivedPTSY(ptsy)); - - // Works, ptsy values can be seen form here - // System.out.print("==> derive called: ptsy: " + ptsy.toString()); - if (this.getAssociatedMetParam() == null) { - // System.out.print(": BUT assoc metparm IS NULL"); - } else { - // System.out.println(": ASSOC metparm to string: " + this.getAssociatedMetParam().toString()); - } + this.setValue(theP03CAmount); } else { this.setValueToMissing(); diff --git a/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/common/metparameters/parameterconversion/PRLibrary.java b/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/common/metparameters/parameterconversion/PRLibrary.java index 1ba10f65d6..a841044b5a 100644 --- a/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/common/metparameters/parameterconversion/PRLibrary.java +++ b/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/common/metparameters/parameterconversion/PRLibrary.java @@ -865,12 +865,23 @@ public final class PRLibrary { ptsyValue = ptsy.getValue().intValue(); - // Make into a negative value - if (ptsyValue > 0 && ptsyValue < 4) { - p03c = Math.abs(p03cavValue) * -1; - } // Positive value - else if (ptsyValue > 4 && ptsyValue < 8) { + // No sign + if (p03cavValue == 0.0) { + return new Amount(p03cavValue, SI.PASCAL); + } + + // No sign + if (ptsyValue == 4) { + return new Amount(p03cavValue, SI.PASCAL); + } + + // Make into positive value + if (ptsyValue >= 0 && ptsyValue <= 4) { p03c = Math.abs(p03cavValue); + + } // Make into a negative value + else if (ptsyValue > 4 && ptsyValue <= 8) { + p03c = Math.abs(p03cavValue) * -1; } return new Amount(p03c, SI.PASCAL); diff --git a/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/common/sounding/NcSoundingLayer.java b/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/common/sounding/NcSoundingLayer.java index 1c12300713..34a972550d 100644 --- a/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/common/sounding/NcSoundingLayer.java +++ b/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/common/sounding/NcSoundingLayer.java @@ -154,6 +154,7 @@ public class NcSoundingLayer implements ISerializableObject, Cloneable { } /** + * * @param pressure * @param geoHeight * @param temperature @@ -164,8 +165,7 @@ public class NcSoundingLayer implements ISerializableObject, Cloneable { * @param windV * @param omega * @param specHumidity - * @param dewDepression - * @param dataType + * @param dpd */ public NcSoundingLayer(float pressure, float geoHeight, float temperature, float dewpoint, float windSpeed, float windDirection, float windU, @@ -187,6 +187,25 @@ public class NcSoundingLayer implements ISerializableObject, Cloneable { } + public NcSoundingLayer(float pressure, float geoHeight, float temperature, + float dewpoint, float windSpeed, float windDirection, float windU, + float windV, float omega, float specHumidity, float relativeHumidity) { + super(); + this.pressure = pressure; + this.geoHeight = geoHeight; + this.temperature = temperature; + this.dewpoint = dewpoint; + this.windSpeed = windSpeed; + this.windDirection = windDirection; + this.windU = windU; + this.windV = windV; + this.omega = omega; + this.specHumidity = specHumidity; + this.relativeHumidity = relativeHumidity; + this.dpd = MISSING; + + } + /* * public String getDataType() { return dataType; } * @@ -246,6 +265,24 @@ public class NcSoundingLayer implements ISerializableObject, Cloneable { this.temperature = temperature; } + /** + * @return the dpd + */ + public float getDpd() { + return dpd; + } + + /** + * @param dpd + * the dpd to set + */ + public void setDpd(float dpd) { + if (dpd == LEGACY_MISSING) + this.dpd = MISSING; + else + this.dpd = dpd; + } + /** * @return the dewpoint in Celsius */ @@ -368,14 +405,6 @@ public class NcSoundingLayer implements ISerializableObject, Cloneable { this.relativeHumidity = relativeHumidity; } - public float getDpd() { - return dpd; - } - - public void setDpd(float dpd) { - this.dpd = dpd; - } - private void computeUV() { if (windSpeed > MISSING && windDirection > MISSING) { Coordinate uv = uvComp(windSpeed, windDirection); @@ -460,6 +489,7 @@ public class NcSoundingLayer implements ISerializableObject, Cloneable { @Override public String toString() { + return "Pressure=" + getPressure() + "mb:Z=" + getGeoHeight() + "m:T=" + getTemperature() + "\u00B0C:Td=" + getDewpoint() + "\u00B0C:WS=" + getWindSpeed() + "m/s:WD=" diff --git a/ncep/gov.noaa.nws.ncep.edex.common/utility/edex_static/base/ncep/stns/vors.xml b/ncep/gov.noaa.nws.ncep.edex.common/utility/edex_static/base/ncep/stns/vors.xml index 7453bdf5f4..4e748f0131 100755 --- a/ncep/gov.noaa.nws.ncep.edex.common/utility/edex_static/base/ncep/stns/vors.xml +++ b/ncep/gov.noaa.nws.ncep.edex.common/utility/edex_static/base/ncep/stns/vors.xml @@ -3951,6 +3951,18 @@ + BTG + 000208 + BATTLE_GROUND + WA + US + 45.75 + -122.59 + 0 + 0 + + + PDX 000208 PORTLAND diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.nctext/utility/edex_static/base/distribution/nctext.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.nctext/utility/edex_static/base/distribution/nctext.xml index 8b589363d3..e521e443cb 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.nctext/utility/edex_static/base/distribution/nctext.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.nctext/utility/edex_static/base/distribution/nctext.xml @@ -104,6 +104,13 @@ ^FXCA20 KWBC (0[1-9]|[12][0-9]|3[01])([01][0-9]|2[0-3])([0-5][0-9]).*PMDCA.* ^FXAK02 KWNH (0[1-9]|[12][0-9]|3[01])([01][0-9]|2[0-3])([0-5][0-9]).*PMDAK.* ^NOUS42 KWBC (0[1-9]|[12][0-9]|3[01])([01][0-9]|2[0-3])([0-5][0-9]).+ + ^AACN01 CWAO (0[1-9]|[12][0-9]|3[01])([01][0-9]|2[0-3])([0-5][0-9]).+ + ^NOUS71 KWNO (0[1-9]|[12][0-9]|3[01])([01][0-9]|2[0-3])([0-5][0-9]).+ + ^NOUS71 KNES (0[1-9]|[12][0-9]|3[01])([01][0-9]|2[0-3])([0-5][0-9]).+ + ^NOUS72 KNES (0[1-9]|[12][0-9]|3[01])([01][0-9]|2[0-3])([0-5][0-9]).+ + ^NOUS72 KNCF (0[1-9]|[12][0-9]|3[01])([01][0-9]|2[0-3])([0-5][0-9]).+ + ^NOCN05 CWAO (0[1-9]|[12][0-9]|3[01])([01][0-9]|2[0-3])([0-5][0-9]).+ + ^NOXX01 KWBC (0[1-9]|[12][0-9]|3[01])([01][0-9]|2[0-3])([0-5][0-9]).+ ^NOUS42 KWNO (0[1-9]|[12][0-9]|3[01])([01][0-9]|2[0-3])([0-5][0-9]).+ ^NPXX10 KWBC (0[1-9]|[12][0-9]|3[01])([01][0-9]|2[0-3])([0-5][0-9]).+ ^NPXX10 KWNO (0[1-9]|[12][0-9]|3[01])([01][0-9]|2[0-3])([0-5][0-9]).+ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncuair/res/pointdata/ncuair.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncuair/res/pointdata/ncuair.xml index 0fca947b17..1338b26114 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncuair/res/pointdata/ncuair.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncuair/res/pointdata/ncuair.xml @@ -111,4 +111,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ncep/gov.noaa.nws.ncep.edex.uengine/src/gov/noaa/nws/ncep/edex/uengine/tasks/profile/NcSoundingDrv.java b/ncep/gov.noaa.nws.ncep.edex.uengine/src/gov/noaa/nws/ncep/edex/uengine/tasks/profile/NcSoundingDrv.java index 1c84703775..1ef3dce2b5 100644 --- a/ncep/gov.noaa.nws.ncep.edex.uengine/src/gov/noaa/nws/ncep/edex/uengine/tasks/profile/NcSoundingDrv.java +++ b/ncep/gov.noaa.nws.ncep.edex.uengine/src/gov/noaa/nws/ncep/edex/uengine/tasks/profile/NcSoundingDrv.java @@ -1,4 +1,5 @@ package gov.noaa.nws.ncep.edex.uengine.tasks.profile; + /** * * gov.noaa.nws.ncep.edex.uengine.tasks.profile.NcSoundingDrv @@ -27,55 +28,56 @@ package gov.noaa.nws.ncep.edex.uengine.tasks.profile; * 01/05/2012 Chin Chen fixed bug that cause exception when query NCUair with bad result * 02/28/2012 Chin Chen modify several sounding query algorithms for better performance * 03/28/2012 Chin Chen modify Grid data sounding query algorithms for better performance + * 06/25/2014 Chin Chen support dropsonde * * Python Script example to query multiple locations at one request: * The following 3 query examples, returns same results. * use lat/lon array -import NcSoundingDataRequest -sndRq = NcSoundingDataRequest.NcSoundingDataRequest() -sndRq.setSndType('UAIR') -sndRq.setRefTime(1290254400000L) -sndRq.setMerge(1) -return sndRq.getSoundingDataBylaLonArray([[37.72999954223633,-122.20999908447266],[32.849998474121094,-117.11000061035156]]) + import NcSoundingDataRequest + sndRq = NcSoundingDataRequest.NcSoundingDataRequest() + sndRq.setSndType('UAIR') + sndRq.setRefTime(1290254400000L) + sndRq.setMerge(1) + return sndRq.getSoundingDataBylaLonArray([[37.72999954223633,-122.20999908447266],[32.849998474121094,-117.11000061035156]]) * use stnId array, use ref time string as input -import NcSoundingDataRequest -sndRq = NcSoundingDataRequest.NcSoundingDataRequest() -sndRq.setSndType('UAIR') -sndRq.setRefTimeStr('2010-11-20 12') -sndRq.setMerge(1) -return sndRq.getSoundingDataByStnIdArray(['OAK','NKX']) + import NcSoundingDataRequest + sndRq = NcSoundingDataRequest.NcSoundingDataRequest() + sndRq.setSndType('UAIR') + sndRq.setRefTimeStr('2010-11-20 12') + sndRq.setMerge(1) + return sndRq.getSoundingDataByStnIdArray(['OAK','NKX']) * use stn number array -import NcSoundingDataRequest -sndRq = NcSoundingDataRequest.NcSoundingDataRequest() -sndRq.setSndType('UAIR') -sndRq.setRefTime(1290254400000L) -sndRq.setMerge(1) -return sndRq.getSoundingDataByStnNumArray(['72293','72493']) + import NcSoundingDataRequest + sndRq = NcSoundingDataRequest.NcSoundingDataRequest() + sndRq.setSndType('UAIR') + sndRq.setRefTime(1290254400000L) + sndRq.setMerge(1) + return sndRq.getSoundingDataByStnNumArray(['72293','72493']) -import NcSoundingDataRequest -sndRq = NcSoundingDataRequest.NcSoundingDataRequest() -sndRq.setSndType('NAMSND') -sndRq.setRefTime('2010-12-08 12:00') -sndRq.setValidTime('2010-12-10 19:00') -sndRq.setMerge(1) -return sndRq.getSoundingDataByStnIdArray(['ATLH']) + import NcSoundingDataRequest + sndRq = NcSoundingDataRequest.NcSoundingDataRequest() + sndRq.setSndType('NAMSND') + sndRq.setRefTime('2010-12-08 12:00') + sndRq.setValidTime('2010-12-10 19:00') + sndRq.setMerge(1) + return sndRq.getSoundingDataByStnIdArray(['ATLH']) -* * * -import NcSoundingDataRequest -sndRq = NcSoundingDataRequest.NcSoundingDataRequest() -sndRq.setSndType('NCUAIR') -sndRq.setDataType('ALLDATA') -sndRq.setRefTime(1320278400000L) -sndRq.setValidTimeStart(1320278400000L) -sndRq.setValidTimeEnd(1320278400000L) -sndRq.setMerge(1) -sndRq.setLevel('500') -sndRq.getSoundingLayer2DataByLatLonArray([32.37,-64.68,47.47,-111.38,53.96,-101.09,60.03,-111.93,28.200000762939453,-87.5999984741211,28.63,-106.08,51.28,-80.59,36.23333,-86.55,34.77556,-76.87917,18.72,-110.95,53.29,-60.36,28.88,-118.3,55.03,-131.57,17.98,-92.92,19.3,-81.35,43.93,-60.01]) -* - + * + import NcSoundingDataRequest + sndRq = NcSoundingDataRequest.NcSoundingDataRequest() + sndRq.setSndType('NCUAIR') + sndRq.setDataType('ALLDATA') + sndRq.setRefTime(1320278400000L) + sndRq.setValidTimeStart(1320278400000L) + sndRq.setValidTimeEnd(1320278400000L) + sndRq.setMerge(1) + sndRq.setLevel('500') + sndRq.getSoundingLayer2DataByLatLonArray([32.37,-64.68,47.47,-111.38,53.96,-101.09,60.03,-111.93,28.200000762939453,-87.5999984741211,28.63,-106.08,51.28,-80.59,36.23333,-86.55,34.77556,-76.87917,18.72,-110.95,53.29,-60.36,28.88,-118.3,55.03,-131.57,17.98,-92.92,19.3,-81.35,43.93,-60.01]) + * + * * @@ -84,26 +86,10 @@ sndRq.getSoundingLayer2DataByLatLonArray([32.37,-64.68,47.47,-111.38,53.96,-101. * @version 1.0 */ -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Calendar; -import java.util.List; -import java.util.Set; -import java.util.TimeZone; - -import javax.measure.converter.UnitConverter; -import javax.measure.unit.NonSI; -import javax.measure.unit.SI; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -import com.raytheon.uf.common.dataplugin.bufrua.UAObs; -import com.vividsolutions.jts.geom.Coordinate; - import gov.noaa.nws.ncep.common.dataplugin.ncuair.NcUairMaxWind; import gov.noaa.nws.ncep.common.dataplugin.ncuair.NcUairObsLevels; -import gov.noaa.nws.ncep.common.dataplugin.ncuair.NcUairTropopause; import gov.noaa.nws.ncep.common.dataplugin.ncuair.NcUairRecord; +import gov.noaa.nws.ncep.common.dataplugin.ncuair.NcUairTropopause; import gov.noaa.nws.ncep.edex.common.metparameters.AirTemperature; import gov.noaa.nws.ncep.edex.common.metparameters.Amount; import gov.noaa.nws.ncep.edex.common.metparameters.DewPointTemp; @@ -115,1907 +101,2028 @@ import gov.noaa.nws.ncep.edex.common.metparameters.WindSpeed; import gov.noaa.nws.ncep.edex.common.metparameters.parameterconversion.NcUnits; import gov.noaa.nws.ncep.edex.common.sounding.NcSoundingCube; import gov.noaa.nws.ncep.edex.common.sounding.NcSoundingLayer; +import gov.noaa.nws.ncep.edex.common.sounding.NcSoundingLayer.DataType; import gov.noaa.nws.ncep.edex.common.sounding.NcSoundingLayer2; import gov.noaa.nws.ncep.edex.common.sounding.NcSoundingModel; import gov.noaa.nws.ncep.edex.common.sounding.NcSoundingProfile; import gov.noaa.nws.ncep.edex.common.sounding.NcSoundingProfile.MdlSndType; -import gov.noaa.nws.ncep.edex.common.sounding.NcSoundingStnInfoCollection; -import gov.noaa.nws.ncep.edex.common.sounding.NcSoundingLayer.DataType; import gov.noaa.nws.ncep.edex.common.sounding.NcSoundingProfile.ObsSndType; import gov.noaa.nws.ncep.edex.common.sounding.NcSoundingProfile.PfcSndType; import gov.noaa.nws.ncep.edex.common.sounding.NcSoundingProfile.SndQueryKeyType; -import gov.noaa.nws.ncep.edex.uengine.tasks.profile.PfcSoundingQuery; - -public class NcSoundingDrv { - private static final UnitConverter metersPerSecondToKnots = SI.METERS_PER_SECOND.getConverterTo(NonSI.KNOT); - private Double lat, lon; - private long refTime=0, validTimeStart=0, validTimeEnd=0; - private String timeLine, refTimeStr, validTimeStartStr=null, validTimeEndStr=null; - private Calendar refTimeCal, validTimeStartCal, validTimeEndCal; - private String stid,level, dataType, sndType, queryType, tableName; - private int merge; - private boolean useNcSoundingLayer2=false; - private int[] dbIdList; - private String[] stnIdArr; - private String[] stnNumArr; - private String modelName; - private String pluginName; - private double[][] latLonArray; // e.g. at nth element, lat=[n][0], lon=[n][1] - private Coordinate[] coordinateArray; - private long []rangeTimeArr; - private List rangeTimeCalLst= new ArrayList(); - private List rangeTimeStringLst = new ArrayList(); - public double[][] getLatLons() { - return latLonArray; - } - public boolean isUseNcSoundingLayer2() { - return useNcSoundingLayer2; - } - - public void setUseNcSoundingLayer2(boolean useNcSoundingLayer2) { - this.useNcSoundingLayer2 = useNcSoundingLayer2; - //System.out.println("useNcSoundingLayer2 set to "+useNcSoundingLayer2); - } - - public long[] getRangeTimeArr() { - return rangeTimeArr; - } - - - public void setRangeTimeArr(long[] rangeTimeArr) { - this.rangeTimeArr = rangeTimeArr; - rangeTimeStringLst.clear(); - rangeTimeCalLst.clear(); - for(int i=0; i< rangeTimeArr.length ; i++){ - Calendar timeCal = Calendar.getInstance(TimeZone.getTimeZone("GMT")); - // reset time - timeCal.setTimeInMillis(rangeTimeArr[i]); - String tStr= String.format("%1$tY-%1$tm-%1$td %1$tH:00:00", timeCal); - this.rangeTimeStringLst.add(tStr); - this.rangeTimeCalLst.add(timeCal); - //System.out.println("setRangeTimeArr: time in long="+rangeTimeArr[i]+ " in str="+tStr); - } - } - public String[] getStnIdArr() { - return stnIdArr; - } - public void setStnIdArr(String[] stnIdArr) { - this.stnIdArr = stnIdArr; - //stnId and coordinateArray (or latLonArray) should be mutual exclusive - coordinateArray = null; - latLonArray = null; - } - - - - public String[] getStnNumArr() { - return stnNumArr; - } - public void setStnNumArr(String[] stnNumArr) { - this.stnNumArr = stnNumArr; - } - - - - public void setLatLons(double[] latLons) { - //from python script, I only know a way to pass one dimensional array, therefore convert it 2-D here. - if(latLons.length >0){ - latLonArray = new double[latLons.length/2][2]; - for(int i=0, j=0; i < latLons.length; i=i+2){ - this.latLonArray[j][0] = latLons[i]; - this.latLonArray[j][1] = latLons[i+1]; - j++; - //System.out.println("latlons = "+ latLonArray[j][0] + ","+ latLonArray[j][1]); - } - coordinateArray = new Coordinate[latLons.length/2]; - for(int i=0, j=0; i < latLons.length; i=i+2){ - Coordinate coor = new Coordinate(); - coor.y = latLons[i]; //latitude - coor.x = latLons[i+1];//longitude - this.coordinateArray[j] = coor; - //System.out.println("i=" + i+ " j=" + j+" latlons = "+ latLons[i+1] + ","+ latLons[i]); - j++; - } - stnIdArr=null; //stnId and coordinateArray (or latLonArray) should be mutual exclusive - } - } - - /** The logger */ - protected final transient Log logger = LogFactory.getLog(getClass()); - - public String getRefTimeStr() { - return refTimeStr; - } - - - /* - * Reference time String should have this format: - * "yyyy-mm-dd hh" - */ - public void setRefTimeStr(String refTimeStr) { - this.refTimeStr = refTimeStr; - refTimeCal = convertTimeStrToCalendar(refTimeStr); - - } - public void setValidTimeStartStr(String validTimeStartStr) { - this.validTimeStartStr = validTimeStartStr; - validTimeStartCal = convertTimeStrToCalendar(validTimeStartStr); - } - public void setValidTimeEndStr(String validTimeEndStr) { - this.validTimeEndStr = validTimeEndStr; - validTimeEndCal = convertTimeStrToCalendar(validTimeEndStr); - - } - private Calendar convertTimeStrToCalendar(String intimeStr){ - int year, mon, date, hr; - String timeStr = new String(intimeStr); - int index = timeStr.indexOf('-'); - - if (index >= 4 ){ - year = Integer.parseInt(timeStr.substring(index-4, index)); - timeStr = timeStr.substring(index+1); - index = timeStr.indexOf('-'); - if(index >= 2 ){ - mon = Integer.parseInt(timeStr.substring(index-2, index)); - timeStr = timeStr.substring(index+1); - index = timeStr.indexOf(' '); - if(index >= 2 ){ - date = Integer.parseInt(timeStr.substring(index-2, index)); - timeStr = timeStr.substring(index+1); - //index = refTimeStr.indexOf(':'); - if(timeStr.length() >= 2 ){ - hr = Integer.parseInt(timeStr.substring(0, 2)); - Calendar cal; - cal = Calendar.getInstance(TimeZone.getTimeZone("GMT")); - // reset time - cal.setTimeInMillis(0); - // set new time - cal.set(year, mon-1, date, hr, 0,0); - return cal; - } - } - } - } - return null; - } +import gov.noaa.nws.ncep.edex.common.sounding.NcSoundingStnInfoCollection; - public void setQueryType(String queryType) { - this.queryType = queryType; - } +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; +import java.util.Set; +import java.util.TimeZone; +import javax.measure.converter.UnitConverter; +import javax.measure.unit.NonSI; +import javax.measure.unit.SI; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; - public String getTimeLine() { - return timeLine; - } +import com.raytheon.uf.common.dataplugin.bufrua.UAObs; +import com.vividsolutions.jts.geom.Coordinate; +public class NcSoundingDrv { + private static final UnitConverter metersPerSecondToKnots = SI.METERS_PER_SECOND + .getConverterTo(NonSI.KNOT); - public void setTimeLine(String timeLine) { - this.timeLine = timeLine; - } + private Double lat, lon; + private long refTime = 0, validTimeStart = 0, validTimeEnd = 0; - public NcSoundingDrv() { - super(); - dbIdList=null; - level="-9999"; - merge = 0; - queryType = "LATLON"; - dataType = "ALLDATA"; - } + private String timeLine, refTimeStr, validTimeStartStr = null, + validTimeEndStr = null; - - public String getTableName() { - return tableName; - } - - - - public void setTableName(String tableName) { - this.tableName = tableName; - - } - - - - public String getDataType() { - return dataType; - } - - - public void setDataType(String dataType) { - this.dataType = dataType; - } - - - - public int[] getDbIdList() { - return dbIdList; - } - - - public void setDbIdList(int[] dbIdList) { - this.dbIdList = dbIdList; - } - - - - public double getLat() { - return lat; - } - - - - public void setLat(double lat) { - this.lat = lat; - } - - public void setLevel (String level) { - this.level = level; - } - - public void setStid (String stid) { - this.stid = stid; - } - - public double getLon() { - return lon; - } - - - - public String getValidTimeStr() { - return validTimeStartStr; - } - - - - public String getStid() { - return stid; - } - - - - public void setLon(double lon) { - this.lon = lon; - } - - public void setMerge (int merge) { - // for native model sounding and model sounding, there is no need to merge. Set merge - // to false accordingly. - this.merge = merge; - } - - - public long getRefTime() { - return refTime; - } - - - - public void setRefTime(long refTime) { - this.refTime = refTime; - Calendar timeCal = Calendar.getInstance(TimeZone.getTimeZone("GMT")); - // reset time - timeCal.setTimeInMillis(refTime); - refTimeStr = String.format("%1$tY-%1$tm-%1$td %1$tH:00:00", timeCal); - refTimeCal = Calendar.getInstance(TimeZone.getTimeZone("GMT")); - refTimeCal.setTimeInMillis(refTime); - } - - - - public long getValidTimeStart() { - return validTimeStart; - } - - - - public void setValidTimeStart(long validTimeStart) { - this.validTimeStart = validTimeStart; - validTimeStartCal = Calendar.getInstance(TimeZone.getTimeZone("GMT")); - validTimeStartCal.setTimeInMillis(validTimeStart); - } - - public long getValidTimeEnd() { - return validTimeEnd; - } - - - - public void setValidTimeEnd(long validTimeEnd) { - this.validTimeEnd = validTimeEnd; - validTimeEndCal = Calendar.getInstance(TimeZone.getTimeZone("GMT")); - validTimeEndCal.setTimeInMillis(validTimeEnd); - } - - - - public String getSndType() { - return sndType; - } - - - - public void setSndType(String sndType) { - this.sndType = sndType; - } - - boolean proces = true; - - public void setModelName(String aModelName) { - this.modelName = aModelName; - } - - public void setPluginName(String aPluginName) { - this.pluginName = aPluginName; - } - - public String getModelName() { - return modelName; - } - - public String getPluginName() { - return pluginName; - } - - //for static sounding type query - public Object getSoundingRangeTimeLine() throws Exception { - Object returnedObject=null; - if (sndType.equals(ObsSndType.NCUAIR.toString())|| - sndType.equals(ObsSndType.DROP.toString()) || - sndType.equals(ObsSndType.TAMDAR.toString())) { - - - //*System.out.println ( "getSoundingTimeLine Processing UAIR request."); - returnedObject = ObservedSoundingQuery.getObservedSndTimeLine(sndType); - } else if (sndType.equals(PfcSndType.NAMSND.toString())|| - sndType.equals(PfcSndType.GFSSND.toString())) { - returnedObject = PfcSoundingQuery.getPfcSndRangeTimeLine(sndType, refTimeStr); - } - /*else if (sndType.equals(MdlSndType.GFSSNDMDL.toString())|| - sndType.equals(MdlSndType.NAMSNDMDL.toString()) || - sndType.equals(MdlSndType.RUC2SNDMDL.toString())|| - sndType.equals(MdlSndType.NGMSNDMDL.toString()) || - sndType.equals(MdlSndType.UKMETSNDMDL.toString())) { - returnedObject = MdlSoundingQuery.getMdlSndRangeTimeLine(sndType, refTimeStr, tableName); -}*/ - return returnedObject; - } - - //for static sounding type query - public Object getSoundingTimeLine() throws Exception { - Object returnedObject=null; - if (sndType.equals(ObsSndType.NCUAIR.toString()) || - sndType.equals(ObsSndType.BUFRUA.toString()) || - sndType.equals(ObsSndType.DROP.toString()) || - sndType.equals(ObsSndType.TAMDAR.toString())) { - - - //*System.out.println ( "getSoundingTimeLine Processing UAIR request."); - returnedObject = ObservedSoundingQuery.getObservedSndTimeLine(sndType); - } else if (sndType.equals(PfcSndType.NAMSND.toString())|| - sndType.equals(PfcSndType.GFSSND.toString())) { - returnedObject = PfcSoundingQuery.getPfcSndTimeLine(sndType); - - } /*else if (sndType.equals(MdlSndType.GFSSNDMDL.toString())|| - sndType.equals(MdlSndType.NAMSNDMDL.toString()) || - sndType.equals(MdlSndType.RUC2SNDMDL.toString())|| - sndType.equals(MdlSndType.NGMSNDMDL.toString()) || - sndType.equals(MdlSndType.UKMETSNDMDL.toString())) { - returnedObject = MdlSoundingQuery.getMdlSndTimeLine(sndType, tableName); -}*/ - - return returnedObject; - } - //for model sounding query - its model type is returned during query time. - public Object getMdlSoundingRangeTimeLine() throws Exception { - Object returnedObject=null; - returnedObject = MdlSoundingQuery.getMdlSndRangeTimeLine(sndType, refTimeStr, tableName); - return returnedObject; - } - //for model sounding query - its model type is returned during query time. - public Object getMdlSoundingTimeLine() throws Exception { - Object returnedObject=null; - - returnedObject = MdlSoundingQuery.getMdlSndTimeLine(sndType, tableName); - - - return returnedObject; - } - public Object getSoundingStnInfoCol() throws Exception { - Object returnedObject=null; - //System.out.println ( "getSoundingStnInfoCol sndType ="+sndType); - NcSoundingStnInfoCollection stnInfoCol=null; - if (sndType.equals(ObsSndType.NCUAIR.toString()) || - sndType.equals(ObsSndType.BUFRUA.toString()) || - sndType.equals(ObsSndType.DROP.toString()) || - sndType.equals(ObsSndType.TAMDAR.toString())) { - stnInfoCol = ObservedSoundingQuery.getObservedSndStnInfoCol(sndType, timeLine); - } - else if(sndType.equals(PfcSndType.NAMSND.toString()) || - sndType.equals(PfcSndType.GFSSND.toString()) || - sndType.equals(PfcSndType.RUCPTYPSND.toString()) || - sndType.equals(PfcSndType.RUC2SND.toString())) { - stnInfoCol = PfcSoundingQuery.getPfcSndStnInfoCol(sndType, timeLine,refTimeStr); - } - - else - return returnedObject; - - returnedObject = stnInfoCol; - return returnedObject; - } - - private List getSndLayersFromNcUairRecordObsLevel(NcUairRecord record){ - List sndLayers = new ArrayList(); - Set obLevels = record.getObsLevels(); - // System.out.println("The datauri for this record is: " + record.getDataURI() ); - if(obLevels.size()>0){ - for(NcUairObsLevels obLev: obLevels){ - NcSoundingLayer sndLayer = new NcSoundingLayer(); - sndLayer.setTemperature(obLev.getTemp()); - sndLayer.setDewpoint(obLev.getDwpt()); - sndLayer.setGeoHeight(obLev.getHght()); - // System.out.println("Sounding layer height = " + sndLayer.getGeoHeight() ); - sndLayer.setPressure(obLev.getPres()); - sndLayer.setWindDirection(obLev.getDrct()); - if(obLev.getSped() >=0 ) - sndLayer.setWindSpeed((float)metersPerSecondToKnots.convert(obLev.getSped())); - else - sndLayer.setWindSpeed(obLev.getSped()); - sndLayers.add(sndLayer); - } - } - //System.out.println("ObsLevel="+obLevels.size()+" sndLayers="+sndLayers.size()); - return sndLayers; - } - - private List getSoundingLayer2FromNcUairRecordObsLevel(NcUairRecord record){ - List sndLayers = new ArrayList(); - Set obLevels = record.getObsLevels(); - - //System.out.println("The datatype for this record is: " + record.getDataType() ); - if( obLevels.size() > 0 ){ - for( NcUairObsLevels obLev: obLevels ){ - // System.out.println("\n\nFrom NcUairObsLevel:"); - // System.out.println("Temperature = " + obLev.getTemp()); - // System.out.println("Pressure = " + obLev.getPres()); - // System.out.println("Dewpoint = " + obLev.getDwpt()); - // System.out.println("Height = " + obLev.getHght()); - // System.out.println("Wind direction = " + obLev.getDrct()); - // System.out.println("Wind speed in m/s= " + obLev.getSped()); - try{ - NcSoundingLayer2 sndLayer = new NcSoundingLayer2(); - /* - * (Non-Javadoc) - * The units for each quantity are chosen based upon the units defined for these quantities - * in the pointdata description file for NcUair - * */ - AirTemperature airTemp = new AirTemperature(); - airTemp.setValue( new Amount ( obLev.getTemp(), SI.CELSIUS ) ); - DewPointTemp dewPoint = new DewPointTemp(); - dewPoint.setValue( new Amount ( obLev.getDwpt(), SI.CELSIUS ) ); - HeightAboveSeaLevel height = new HeightAboveSeaLevel(); - height.setValue(obLev.getHght(), SI.METER ); - - // System.out.println("Sounding layer height = " + sndLayer.getGeoHeight().doubleValue() ); - PressureLevel pressure = new PressureLevel(); - pressure.setValue( new Amount (obLev.getPres(), NcUnits.MILLIBAR )); - - WindDirection windDirection = new WindDirection(); - windDirection.setValue(obLev.getDrct(), NonSI.DEGREE_ANGLE); - WindSpeed windSpeed = new WindSpeed(); - float speed = obLev.getSped(); - - /* - * ( Non-Javadoc ) - * There are no negative speed values decoded except for either -999 or -9999 - * to indicate that the speed is missing. The check for the positive speed value - * ensures that the unit conversion happens for non-missing speed values. - */ - if ( speed >= 0 ){ - double convertedSpeed = metersPerSecondToKnots.convert(speed); - windSpeed.setValue( convertedSpeed, NonSI.KNOT); - } - else{ - windSpeed.setValueToMissing(); - } - - // System.out.println("\nFrom MetParameters:"); - // System.out.println("Temperature = " + airTemp.getValue().floatValue()); - // System.out.println("Pressure = " + pressure.getValue().floatValue()); - // System.out.println("Dewpoint = " + dewPoint.getValue().floatValue()); - // System.out.println("Height = " + height.getValue().floatValue()); - // System.out.println("Wind direction = " + windDirection.getValue().floatValue()); - // System.out.println("Wind speed = " + windSpeed.getValue().floatValue()); - sndLayer.setTemperature(airTemp); - sndLayer.setPressure(pressure); - sndLayer.setDewpoint(dewPoint); - sndLayer.setGeoHeight(height); - sndLayer.setWindDirection(windDirection); - sndLayer.setWindSpeed(windSpeed); - sndLayers.add(sndLayer); - } - catch ( Exception e ){ - e.printStackTrace(); - } - } - } - //System.out.println("ObsLevel="+obLevels.size()+" sndLayers="+sndLayers.size()); - return sndLayers; - } - - private List getSndLayersFromNcUairRecordTrop(NcUairRecord record){ - List sndLayers = new ArrayList(); - Set trops = record.getTropopause(); - if(trops.size()>0){ - for(NcUairTropopause trop: trops){ - NcSoundingLayer sndLayer = new NcSoundingLayer(); - sndLayer.setTemperature(trop.getTemp()); - sndLayer.setDewpoint(trop.getDwpt()); - sndLayer.setPressure(trop.getPres()); - sndLayer.setWindDirection(trop.getDrct()); - if(trop.getSped() >=0 ) - sndLayer.setWindSpeed((float)metersPerSecondToKnots.convert(trop.getSped())); - else - sndLayer.setWindSpeed(trop.getSped()); - sndLayers.add(sndLayer); - } - } - //System.out.println("trops="+trops.size()+" sndLayers="+sndLayers.size()); - return sndLayers; - } - - private List getSoundingLayer2FromNcUairRecordTrop(NcUairRecord record){ - List sndLayers = new ArrayList(); - Set trops = record.getTropopause(); - if(trops.size()>0){ - for(NcUairTropopause trop: trops){ - try{ - NcSoundingLayer2 sndLayer = new NcSoundingLayer2(); - /* - * (Non-Javadoc) - * The units for each quantity are chosen based upon the units defined for these quantities - * in the pointdata description file for NcUair - * */ - AirTemperature airTemp = new AirTemperature(); - airTemp.setValue( new Amount ( trop.getTemp(), SI.CELSIUS ) ); - DewPointTemp dewPoint = new DewPointTemp(); - dewPoint.setValue( new Amount ( trop.getDwpt(), SI.CELSIUS) ); - PressureLevel pressure = new PressureLevel(); - pressure.setValue( new Amount (trop.getPres(), NcUnits.MILLIBAR )); - WindDirection windDirection = new WindDirection(); - windDirection.setValue(trop.getDrct(), NonSI.DEGREE_ANGLE); - WindSpeed windSpeed = new WindSpeed(); - float speed = trop.getSped(); - /* - * ( Non-Javadoc ) - * There are no negative speed values decoded except for either -999 or -9999 - * to indicate that the speed is missing. The check for the positive speed value - * ensures that the unit conversion happens for non-missing speed values. - */ - if ( speed >= 0 ){ - double convertedSpeed = metersPerSecondToKnots.convert(speed); - windSpeed.setValue( convertedSpeed, NonSI.KNOT); - } - else{ - windSpeed.setValueToMissing(); - } - sndLayer.setTemperature(airTemp); - sndLayer.setPressure(pressure); - sndLayer.setDewpoint(dewPoint); - sndLayer.setWindDirection(windDirection); - sndLayer.setWindSpeed(windSpeed); - sndLayers.add(sndLayer); - } - catch ( Exception e ){ - e.printStackTrace(); - } - } - } - //System.out.println("trops="+trops.size()+" sndLayers="+sndLayers.size()); - return sndLayers; - } - - private List getSndLayersFromNcUairRecordMaxw(NcUairRecord record){ - List sndLayers = new ArrayList(); - Set maxWinds = record.getMaxWind(); - if(maxWinds.size()>0){ - for(NcUairMaxWind maxWind: maxWinds){ - NcSoundingLayer sndLayer = new NcSoundingLayer(); - sndLayer.setPressure(maxWind.getPres()); - sndLayer.setWindDirection(maxWind.getDrct()); - if(maxWind.getSped() >=0 ) - sndLayer.setWindSpeed((float)metersPerSecondToKnots.convert(maxWind.getSped())); - else - sndLayer.setWindSpeed(maxWind.getSped()); - sndLayers.add(sndLayer); - } - } - //System.out.println("maxWinds="+maxWinds.size()+" sndLayers="+sndLayers.size()); - return sndLayers; - } - - private List getSoundingLayer2FromNcUairRecordMaxw(NcUairRecord record){ - List sndLayers = new ArrayList(); - Set maxWinds = record.getMaxWind(); - if(maxWinds.size()>0){ - /* - * (Non-Javadoc) - * The units for each quantity are chosen based upon the units defined for these quantities in the pointdata description file for NcUair - * */ - for(NcUairMaxWind maxWind: maxWinds){ - try{ - NcSoundingLayer2 sndLayer = new NcSoundingLayer2(); - PressureLevel pressure = new PressureLevel(); - // pressure.setValueAs(maxWind.getPres(), "hPa" ); - pressure.setValue( new Amount (maxWind.getPres(), NcUnits.MILLIBAR )); - WindDirection windDirection = new WindDirection(); - windDirection.setValue(maxWind.getDrct(), NonSI.DEGREE_ANGLE ); - WindSpeed windSpeed = new WindSpeed(); - float speed = maxWind.getSped(); - /* - * ( Non-Javadoc ) - * There are no negative speed values decoded except for either -999 or -9999 - * to indicate that the speed is missing. The check for the positive speed value - * ensures that the unit conversion happens for non-missing speed values. - */ - if ( speed >= 0 ){ - double convertedSpeed = metersPerSecondToKnots.convert(speed); - windSpeed.setValue( convertedSpeed, NonSI.KNOT); - } - else{ - windSpeed.setValueToMissing(); - } - sndLayer.setPressure(pressure); - sndLayer.setWindDirection(windDirection); - sndLayer.setWindSpeed(windSpeed); - sndLayers.add(sndLayer); - } - catch ( Exception e ){ - e.printStackTrace(); - } - } - } - //System.out.println("maxWinds="+maxWinds.size()+" sndLayers="+sndLayers.size()); - return sndLayers; - } - /* - * CHin: 2012 Feb 13: Support PFC sounding with one lat/lon location only..... - * Query PFC sounding data in one shot. to see performce difference - * - public Object getSoundingDataByRangeTimeArray() throws Exception { - //long t01 = System.currentTimeMillis(); - Object returnedObject = new Object(); - //System.out.println ( " getSoundingDataByLatLonArray "); - - - //MergeSounding ms = new MergeSounding(); - NcSoundingCube cube = new NcSoundingCube(); - //List soundingProfileList = new ArrayList(); - NcSoundingCube.QueryStatus failedRtnStatus = NcSoundingCube.QueryStatus.FAILED; - Coordinate[] coorArray = new Coordinate[1]; - Coordinate latLon = new Coordinate(); - latLon.y= lat; - latLon.x= lon; - coorArray[0]=latLon; - //List pfs2=PfcSoundingQuery.getPfcSndDataBySoundTimeRangeArray(lat, lon, null, refTimeStr, rangeTimeStringLst, sndType, SndQueryKeyType.LATLON); - List pfs=PfcSoundingQuery.getPfcSndDataGeneric(coorArray, null, refTimeStr, rangeTimeStringLst, sndType,level); - - if(pfs.size() == 0 ) - cube.setRtnStatus(failedRtnStatus); - else - cube.setRtnStatus(NcSoundingCube.QueryStatus.OK); - - cube.setSoundingProfileList(pfs); - returnedObject = cube; - - //long t02 = System.currentTimeMillis(); - //System.out.println("PFC/OBS cube retreival took " + (t02 - t01)); - return returnedObject; - }*/ - /* - * This API is for getting multiple locations sounding info at one shot. - * latLonArray is used to input lat/lon for each location. - * - * Chin's Note @ 02/27/2012 - * This API is currently only used for query grid and bufrua data by Nsharp. - */ - private Object getSoundingDataByLatLonArray() throws Exception { - //long t01 = System.currentTimeMillis(); - Object returnedObject = new Object(); - //System.out.println ( " getSoundingDataByLatLonArray entered"); - - List timeLineStrList=new ArrayList(); - List timeLimeCalList = new ArrayList(); - - NcSoundingCube cube = new NcSoundingCube(); - List soundingProfileList = new ArrayList(); - SndQueryKeyType sndQuery = SndQueryKeyType.LATLON; - NcSoundingCube.QueryStatus failedRtnStatus = NcSoundingCube.QueryStatus.FAILED; - MergeSounding ms = new MergeSounding(); - NcSoundingProfile pf = null; - if(sndType.equals(MdlSndType.ANY.toString()) ) { - //temp fix for now... - if(validTimeEnd !=0 && validTimeEnd > validTimeStart){ - //range of time line request - timeLimeCalList = ObservedSoundingQuery.getObservedSndTimeRangeList(sndType, validTimeStartCal, validTimeEndCal); - for (int i=0; i< timeLimeCalList.size(); i++){ - Calendar timeCal = timeLimeCalList.get(i); - String timeStr = String.format("%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS", timeCal); - timeLineStrList.add(timeStr); - - } - } - else { - //one single time line - timeLineStrList.add(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(refTimeCal.getTime())); - timeLimeCalList.add(refTimeCal); - } - if(latLonArray!= null){ - /* old way - for ( int i=0; i < latLonArray.length ; i++) - { - double lat = latLonArray[i][0]; - double lon = latLonArray[i][1]; - for (int j=0; j< timeLineStrList.size(); j++){ - String timeStr = timeLineStrList.get(j); - pf = MdlSoundingQuery.getMdlSndData( lat, lon, timeStr, validTimeStartStr, pluginName, modelName ); - if(pf.getRtnStatus() != NcSoundingCube.QueryStatus.OK){ - failedRtnStatus = pf.getRtnStatus(); - pf = null; - } - if(pf != null && pf.getSoundingLyLst().size()>0) { - soundingProfileList.add(pf); - pf = null; - } - } - }*/ - //Chin Note: using new API to query multiple Points at one shot - soundingProfileList =MdlSoundingQuery.getMdlSndDataProfileList(latLonArray,timeLineStrList.get(0), validTimeStartStr, pluginName, modelName); - } - } - else if(sndType.equals(ObsSndType.BUFRUA.toString())){ - int arrLen =0 ; - if(latLonArray!= null){ - arrLen = latLonArray.length; - sndQuery = SndQueryKeyType.LATLON; - } - else if (stnIdArr!=null){ - arrLen = stnIdArr.length; - sndQuery = SndQueryKeyType.STNID; - } - double lat=0,lon=0; - String stnId=""; - for ( int i=0; i < arrLen ; i++) - { - - //Calendar timeCal = timeLimeCalList.get(j); - - if(latLonArray!= null){ - //make sure we have right precision... - lat = latLonArray[i][0]; - lon = latLonArray[i][1]; - } - else { - stnId = stnIdArr[i]; - } - /* - * Process sounding data. - */ - - - List sls = new ArrayList(); - List ttaa = new ArrayList(); - List ttbb = new ArrayList(); - List ttcc = new ArrayList(); - List ttdd = new ArrayList(); - List ppaa = new ArrayList(); - List ppbb = new ArrayList(); - List ppcc = new ArrayList(); - List ppdd = new ArrayList(); - List trop_a = new ArrayList(); - List trop_c = new ArrayList(); - List wmax_a = new ArrayList(); - List wmax_c = new ArrayList(); - for(Calendar timeCal :rangeTimeCalLst){ - if ( merge == 0 ) { - // ms.unMergedUairSounding - //*System.out.println ( " Request unmerged data"); - if(dataType.equals(DataType.ALLDATA.toString())) - pf = ObservedSoundingQuery.getObservedSndBufruaAllData(lat, lon,stnId, timeCal, sndQuery); - else - pf = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, stnId, timeCal, dataType, sndQuery); - - } else { - - // Get TTAA. If not existent, try ship data (UUAA). If level is not null or missing, - // the body of code will return a sounding list with MAN data or single level data. - //*System.out.println ( " Request merged data at lat="+ lat+" lon="+lon+ " refT="+ timeCal.getTime().toGMTString()); - - ttaa = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, stnId, timeCal,"TTAA", sndQuery).getSoundingLyLst(); - ttbb = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, stnId, timeCal, "TTBB", sndQuery).getSoundingLyLst(); - ttcc = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, stnId, timeCal, "TTCC", sndQuery).getSoundingLyLst(); - ttdd = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, stnId, timeCal, "TTDD", sndQuery).getSoundingLyLst(); - //ppaa = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, stnId, timeCal, "PPAA", sndQuery).getSoundingLyLst(); - ppbb = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, stnId, timeCal, "PPBB", sndQuery).getSoundingLyLst(); - //ppcc = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, stnId, timeCal, "PPCC", sndQuery).getSoundingLyLst(); - ppdd = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, stnId, timeCal, "PPDD", sndQuery).getSoundingLyLst(); - wmax_a = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, stnId, timeCal, "MAXWIND_A", sndQuery).getSoundingLyLst(); - wmax_c = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, stnId, timeCal, "MAXWIND_C", sndQuery).getSoundingLyLst(); - trop_a = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, stnId, timeCal, "TROPOPAUSE_A", sndQuery).getSoundingLyLst(); - trop_c = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, stnId, timeCal, "TROPOPAUSE_C", sndQuery).getSoundingLyLst(); - pf = ObservedSoundingQuery.getObservedSndStnInfo(lat, lon,stnId,sndType, timeCal,sndQuery); - sls = ms.mergeUairSounding(level,ttaa,ttbb,ttcc,ttdd,ppaa,ppbb,ppcc,ppdd,trop_a,trop_c,wmax_a,wmax_c,pf.getStationElevation()); - - //System.out.println("BUFRUA Number of Layers after merge:"+sls.size() + " level="+level + " ms.isNumber(level)="+ms.isNumber(level)); - //for(NcSoundingLayer ly: sls){ - // System.out.println("Pre= "+ly.getPressure()+ " Dew= "+ ly.getDewpoint()+ " T= "+ ly.getTemperature()+" H="+ly.getGeoHeight()+" WSp="+ly.getWindSpeed()); - //} - - if (level.toUpperCase().equalsIgnoreCase("MAN") ) - pf.setSoundingLyLst(sls); - else if( ms.isNumber(level)>=0 ){ - if(sls.size() == 1){ - //System.out.println("NCUAIR get one layer using level = "+ level); - pf.setSoundingLyLst(sls); - } - else { - pf = null; - //System.out.println("NCUAIR get 0 layer using level = "+ level); - } - } - else { - if(sls.isEmpty() || sls.size() <=1) - pf = null; - else - pf.setSoundingLyLst(sls); - } - - } - if(pf != null && pf.getSoundingLyLst().size()>0) { - soundingProfileList.add(pf); - pf = null; - } - } - } - } - - - if(soundingProfileList.size() == 0 ) - cube.setRtnStatus(failedRtnStatus); - else - cube.setRtnStatus(NcSoundingCube.QueryStatus.OK); - - cube.setSoundingProfileList(soundingProfileList); - returnedObject = cube; - - //long t02 = System.currentTimeMillis(); - //System.out.println("PFC/OBS cube retreival took " + (t02 - t01)); - return returnedObject; - } - - - - /* Chin:: 2/21/2012 - * Only NCUair and PFC (modelsounding DB) query is supported now - * Use generic query API - * Mainly used by CAVE Resource plotting - * Returned Sounding data are stored in NcSoundingLayer2. - * */ - public Object getSoundingData2Generic() throws Exception { - long t01 = System.currentTimeMillis(); - Object returnedObject = new Object(); - //*System.out.println ( " getSoundingDataByLatLonArray "); - if(stnIdArr.length <= 0){ - returnedObject = null; - return returnedObject; - } - //List timeLineStrList=new ArrayList();; - //List timeLimeCalList = new ArrayList(); - - NcSoundingCube cube = new NcSoundingCube(); - List soundingProfileList = new ArrayList(0); - NcSoundingCube.QueryStatus failedRtnStatus = NcSoundingCube.QueryStatus.FAILED; - - NcSoundingProfile pf; - MergeSounding2 ms = new MergeSounding2(); - if (sndType.equals(ObsSndType.NCUAIR.toString())) { - //Note: in NC Uair table, we only use ref time for query - if(rangeTimeStringLst!=null && rangeTimeStringLst.size() == 0){ - //one single time line - rangeTimeStringLst.add(refTimeStr); - } - //for (int j=0; j< rangeTimeStringLst.size(); j++){ - //String timeStr = rangeTimeStringLst.get(j); - List uairRecordArrList; - long t003 = System.currentTimeMillis(); - uairRecordArrList = ObservedSoundingQuery.getObservedSndNcUairDataGeneric(coordinateArray, stnIdArr, rangeTimeStringLst,rangeTimeArr); - long t004 = System.currentTimeMillis(); - System.out.println("getObservedSndNcUairDataGeneric query took "+(t004-t003)+"ms"); - if(uairRecordArrList!=null && uairRecordArrList.size()>0){ - long t005 = System.currentTimeMillis(); - //for each station, processing its records list and keep in one profile - for(NcUairRecord[] recordArray:uairRecordArrList){ - - //System.out.println("getSoundingDataByLatLonArray:NcUair: lat="+lat+ " lon="+lon); - //make sure we have right precision... - - if ( merge == 0 ) { - //Chin...need more coding - pf = null; - } - else{ - pf = new NcSoundingProfile(); - /* Chin: If caller need all query stns returned (no matter there is no data), then we may need to add this code... - if(recordArray != null && recordArray.length == 1){ - //could be a special case that the record is just used to return this stn's lat/lon back - if(recordArray[0].getNil() == true){ - pf.setStationLatitude((float)recordArray[0].getLatitude()); - pf.setStationLongitude((float)recordArray[0].getLongitude()); - soundingProfileList.add(pf); - continue; // skip this stn as there are no real data retrieved - } - }*/ - if(recordArray != null && recordArray.length >0){ - List sls = new ArrayList(); - List ttaa = new ArrayList(); - List ttbb = new ArrayList(); - List ttcc = new ArrayList(); - List ttdd = new ArrayList(); - List ppaa = new ArrayList(); - List ppbb = new ArrayList(); - List ppcc = new ArrayList(); - List ppdd = new ArrayList(); - List trop_a = new ArrayList(); - List trop_c = new ArrayList(); - List wmax_a = new ArrayList(); - List wmax_c = new ArrayList(); - - for(int k=0; k< recordArray.length; k++){ - NcUairRecord record= recordArray[k]; - if(record.getDataType().equals("TTAA")){ - ttaa = getSoundingLayer2FromNcUairRecordObsLevel( record ); - trop_a = getSoundingLayer2FromNcUairRecordTrop( record); - wmax_a = getSoundingLayer2FromNcUairRecordMaxw(record ); - } - else if(record.getDataType().equals("TTBB")){ - ttbb = getSoundingLayer2FromNcUairRecordObsLevel(record); - } - else if(record.getDataType().equals("TTCC")){ - ttcc = getSoundingLayer2FromNcUairRecordObsLevel( record ); - trop_c = getSoundingLayer2FromNcUairRecordTrop( record ); - wmax_c = getSoundingLayer2FromNcUairRecordMaxw( record ); - } - else if(record.getDataType().equals("TTDD")){ - ttdd = getSoundingLayer2FromNcUairRecordObsLevel(record); - } - else if(record.getDataType().equals("PPAA")){ - ppaa= getSoundingLayer2FromNcUairRecordObsLevel(record); - } - else if(record.getDataType().equals("PPBB")){ - ppbb = getSoundingLayer2FromNcUairRecordObsLevel(record); - } - else if(record.getDataType().equals("PPCC")){ - ppcc = getSoundingLayer2FromNcUairRecordObsLevel(record); - } - else if(record.getDataType().equals("PPDD")){ - ppdd = getSoundingLayer2FromNcUairRecordObsLevel(record); - } - } - pf.setStationElevation((float)recordArray[0].getElevation()); - pf.setStationId(recordArray[0].getStationId()); - if(recordArray[0].getStnum() != null && recordArray[0].getStnum().length()>0) - pf.setStationNum(Integer.parseInt(recordArray[0].getStnum())); - pf.setStationLatitude(recordArray[0].getLatitude()); - pf.setStationLongitude(recordArray[0].getLongitude()); - //System.out.println(" input lat="+lat+" pf's lat="+pf.getStationLatitude()+" elv="+pf.getStationElevation()+" stnId="+pf.getStationId()); - sls = ms.mergeUairSounding(level,ttaa,ttbb,ttcc,ttdd,ppaa,ppbb,ppcc,ppdd,trop_a,trop_c,wmax_a,wmax_c,pf.getStationElevation()); - - if (level.toUpperCase().equalsIgnoreCase("MAN") ){ - pf.setSoundingLyLst2( sls ); - // System.out.println("sls set to the sounding profile"); - } - else if( ms.isNumber( level )>=0 ){ - if(sls.size() == 1){ - // System.out.println("NcUair get one layer using level = "+ level); - pf.setSoundingLyLst2( sls ); - } - else { - pf = null; - // System.out.println("NcUair get 0 layer using level = "+ level); - } - } - else { - if(sls.isEmpty() || sls.size() <=1){ - pf = null; - // System.out.println("not MAN level & sls is empty or 1"); - } - else{ - pf.setSoundingLyLst2 ( sls ); - // System.out.println("sls set to the sounding profile for level = " + level); - } - } - } - } - if(pf != null && pf.getSoundingLyLst2().size()>0) { - //System.out.println(" pf is not null, so adding a profile to the list of NcSoundingProfiles "); - soundingProfileList.add(pf); - pf = null; - } - - } - long t006 = System.currentTimeMillis(); - System.out.println("getSoundingData2Generic total sounding time merging for "+uairRecordArrList.size()+" profiles took "+(t006-t005)+"ms"); - } - //} - } - else if(sndType.equals(PfcSndType.NAMSND.toString()) || - sndType.equals(PfcSndType.GFSSND.toString()) || - sndType.equals(PfcSndType.RUCPTYPSND.toString()) || - sndType.equals(PfcSndType.RUC2SND.toString())) { - - - List listReturned = PfcSoundingQuery.getPfcSndDataGeneric(null, stnIdArr,refTimeStr, rangeTimeStringLst,sndType,level); - soundingProfileList.addAll(listReturned); - convertPfcNcSoundingLayerToNcSoundingLayer2(soundingProfileList); - //sysPrintProfileLayer2(soundingProfileList); - - } - /* - else if(sndType.equals(MdlSndType.ANY.toString()) ) { - - pf = MdlSoundingQuery.getMdlSndData( lat, lon, refTimeStr, validTimeStartStr, pluginName, modelName ); - if(pf.getRtnStatus() != NcSoundingCube.QueryStatus.OK){ - failedRtnStatus = pf.getRtnStatus(); - pf = null; - } - } - */ - /*else if(sndType.equals(ObsSndType.BUFRUA.toString())){ - List sls = new ArrayList(); - List ttaa = new ArrayList(); - List ttbb = new ArrayList(); - List ttcc = new ArrayList(); - List ttdd = new ArrayList(); - List ppaa = new ArrayList(); - List ppbb = new ArrayList(); - List ppcc = new ArrayList(); - List ppdd = new ArrayList(); - List trop_a = new ArrayList(); - List trop_c = new ArrayList(); - List wmax_a = new ArrayList(); - List wmax_c = new ArrayList(); - if ( merge == 0 ) { - // ms.unMergedUairSounding - //*System.out.println ( " Request unmerged data"); - if(dataType.equals(DataType.ALLDATA.toString())) - pf = ObservedSoundingQuery.getObservedSndBufruaAllData(lat, lon,"", refTimeCal, sndQuery); - else - pf = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", refTimeCal, dataType, sndQuery); - - } else { - - // Get TTAA. If not existent, try ship data (UUAA). If level is not null or missing, - // the body of code will return a sounding list with MAN data or single level data. - //*System.out.println ( " Request merged data at lat="+ lat+" lon="+lon+ " refT="+ refTimeCal.getTime().toGMTString()); - - pf = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", refTimeCal,"TTAA", sndQuery); - ttaa = pf.getSoundingLyLst2(); - ttbb = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", refTimeCal, "TTBB", sndQuery).getSoundingLyLst2(); - ttcc = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", refTimeCal, "TTCC", sndQuery).getSoundingLyLst2(); - ttdd = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", refTimeCal, "TTDD", sndQuery).getSoundingLyLst2(); - //ppaa = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", refTimeCal, "PPAA", sndQuery).getSoundingLyLst2(); - ppbb = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", refTimeCal, "PPBB", sndQuery).getSoundingLyLst2(); - //ppcc = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", refTimeCal, "PPCC", sndQuery).getSoundingLyLst2(); - ppdd = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", refTimeCal, "PPDD", sndQuery).getSoundingLyLst2(); - wmax_a = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", refTimeCal, "MAXWIND_A", sndQuery).getSoundingLyLst2(); - wmax_c = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", refTimeCal, "MAXWIND_C", sndQuery).getSoundingLyLst2(); - trop_a = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", refTimeCal, "TROPOPAUSE_A", sndQuery).getSoundingLyLst2(); - trop_c = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", refTimeCal, "TROPOPAUSE_C", sndQuery).getSoundingLyLst2(); - pf = ObservedSoundingQuery.getObservedSndStnInfo(lat, lon,"",sndType, refTimeCal,sndQuery); - sls = ms.mergeUairSounding(level,ttaa,ttbb,ttcc,ttdd,ppaa,ppbb,ppcc,ppdd,trop_a,trop_c,wmax_a,wmax_c,pf.getStationElevation()); - - //System.out.println("BUFRUA Number of Layers after merge:"+sls.size() + " level="+level + " ms.isNumber(level)="+ms.isNumber(level)); - //for(NcSoundingLayer ly: sls){ - // System.out.println("Pre= "+ly.getPressure()+ " Dew= "+ ly.getDewpoint()+ " T= "+ ly.getTemperature()+" H="+ly.getGeoHeight()+" WSp="+ly.getWindSpeed()); - //} - - if (level.toUpperCase().equalsIgnoreCase("MAN") ) - pf.setSoundingLyLst2(sls); - else if( ms.isNumber(level)>=0 ){ - if(sls.size() == 1){ - //System.out.println("NcUair get one layer using level = "+ level); - pf.setSoundingLyLst2(sls); - } - else { - pf = null; - //System.out.println("NcUair get 0 layer using level = "+ level); - } - } - else { - if(sls.isEmpty() || sls.size() <=1) - pf = null; - else - pf.setSoundingLyLst2(sls); - } - - } - - if(pf != null && pf.getSoundingLyLst2().size()>0) { - //System.out.println(" pf is not null, so adding a profile to the list of NcSoundingProfiles "); - - // TODO : move this into the ObservedSoundingQuery methods. - // - pf.setStationLatitude( lat ); - pf.setStationLongitude( lon ); - - - soundingProfileList.add(pf); - //pf.setStationLatitude(lat.floatValue()); - //pf.setStationLongitude(lon.floatValue()); - pf = null; - } - } */ - if(soundingProfileList.size() == 0 ){ - //System.out.println(" Return status from NcSoundingDrv.getSoundingLayer2DataUsingLatLonArray() is set to failed "); - cube.setRtnStatus(failedRtnStatus); - - } - else{ - //System.out.println(); - cube.setRtnStatus(NcSoundingCube.QueryStatus.OK); - //long t02 = System.currentTimeMillis(); - //System.out.println("Return status from NcSoundingDrv.getSoundingLayer2DataUsingLatLonArray() - success, cube retreival took " + (t02 - t01)); - } - cube.setSoundingProfileList(soundingProfileList); - /*for(int i =0; i < cube.getSoundingProfileList().size();i++){ - System.out.println("lat/lon="+ cube.getSoundingProfileList().get(i).getStationLatitude()+"/"+cube.getSoundingProfileList().get(i).getStationLongitude()+ - " temp="+cube.getSoundingProfileList().get(i).getSoundingLyLst2().get(0).getTemperature()+" dewp="+cube.getSoundingProfileList().get(i).getSoundingLyLst2().get(0).getDewpoint()+" press="+ - cube.getSoundingProfileList().get(i).getSoundingLyLst2().get(0).getPressure() + " height="+cube.getSoundingProfileList().get(i).getSoundingLyLst2().get(0).getGeoHeight()+ - " windSp="+cube.getSoundingProfileList().get(i).getSoundingLyLst2().get(0).getWindSpeed()+" windDir="+cube.getSoundingProfileList().get(i).getSoundingLyLst2().get(0).getWindDirection()+ - " omega="+cube.getSoundingProfileList().get(i).getSoundingLyLst2().get(0).getOmega()); - }*/ - returnedObject = cube; - //long t02 = System.currentTimeMillis(); - //System.out.println("getSoundingData2Generic query took "+(t02-t01)+" ms in total"); - - return returnedObject; - } - /* Chin:: 2/22/2012 - * Only NCUair and PFC (modelsounding DB) query is supported now - * Use generic query API - * */ - public Object getSoundingDataGeneric() throws Exception { - long t01 = System.currentTimeMillis(); - Object returnedObject = new Object(); - //*System.out.println ( " getSoundingDataByLatLonArray "); - - - NcSoundingCube cube = new NcSoundingCube(); - List soundingProfileList = new ArrayList(0); - NcSoundingCube.QueryStatus failedRtnStatus = NcSoundingCube.QueryStatus.FAILED; - - if (sndType.equals(ObsSndType.NCUAIR.toString())) { - //Note: in NC Uair table, we only use ref time for query - if(rangeTimeStringLst!=null && rangeTimeStringLst.size() == 0){ - //one single time line - rangeTimeStringLst.add(refTimeStr); - } - - List uairRecordArrList; - //long t003 = System.currentTimeMillis(); - uairRecordArrList = ObservedSoundingQuery.getObservedSndNcUairDataGeneric(coordinateArray, stnIdArr, rangeTimeStringLst,rangeTimeArr); - //long t004 = System.currentTimeMillis(); - //System.out.println("getObservedSndNcUairDataGeneric API call took "+(t004-t003)+"ms"); - if(uairRecordArrList!=null && uairRecordArrList.size()>0){ - //long t005 = System.currentTimeMillis(); - soundingProfileList=processQueryReturnedNcUairData( uairRecordArrList, useNcSoundingLayer2); - //long t006 = System.currentTimeMillis(); - //System.out.println("getSoundingDataGeneric total sounding time merging for "+uairRecordArrList.size()+" profiles took "+(t006-t005)+"ms"); - } - - } - else if(sndType.equals(PfcSndType.NAMSND.toString()) || - sndType.equals(PfcSndType.GFSSND.toString()) || - sndType.equals(PfcSndType.RUCPTYPSND.toString()) || - sndType.equals(PfcSndType.RUC2SND.toString())) { - - - List listReturned = PfcSoundingQuery.getPfcSndDataGeneric(coordinateArray, stnIdArr,refTimeStr, rangeTimeStringLst,sndType,level); - soundingProfileList.addAll(listReturned); - if(useNcSoundingLayer2==true){ - convertPfcNcSoundingLayerToNcSoundingLayer2(soundingProfileList); - //sysPrintProfileLayer2(soundingProfileList); - } - - } - else if(sndType.equals(MdlSndType.ANY.toString()) ) { - return getSoundingDataByLatLonArray(); - } - else if(sndType.equals(ObsSndType.BUFRUA.toString())){ - return getSoundingDataByLatLonArray(); - } - if(soundingProfileList.size() == 0 ){ - //System.out.println(" Return status from NcSoundingDrv.getSoundingLayer2DataUsingLatLonArray() is set to failed "); - cube.setRtnStatus(failedRtnStatus); - - } - else{ - //System.out.println(); - cube.setRtnStatus(NcSoundingCube.QueryStatus.OK); - //long t02 = System.currentTimeMillis(); - //System.out.println("Return status from NcSoundingDrv.getSoundingLayer2DataUsingLatLonArray() - success, cube retreival took " + (t02 - t01)); - } - cube.setSoundingProfileList(soundingProfileList); - /*for(int i =0; i < cube.getSoundingProfileList().size();i++){ - System.out.println("lat/lon="+ cube.getSoundingProfileList().get(i).getStationLatitude()+"/"+cube.getSoundingProfileList().get(i).getStationLongitude()+ - " temp="+cube.getSoundingProfileList().get(i).getSoundingLyLst2().get(0).getTemperature()+" dewp="+cube.getSoundingProfileList().get(i).getSoundingLyLst2().get(0).getDewpoint()+" press="+ - cube.getSoundingProfileList().get(i).getSoundingLyLst2().get(0).getPressure() + " height="+cube.getSoundingProfileList().get(i).getSoundingLyLst2().get(0).getGeoHeight()+ - " windSp="+cube.getSoundingProfileList().get(i).getSoundingLyLst2().get(0).getWindSpeed()+" windDir="+cube.getSoundingProfileList().get(i).getSoundingLyLst2().get(0).getWindDirection()+ - " omega="+cube.getSoundingProfileList().get(i).getSoundingLyLst2().get(0).getOmega()); - }*/ - returnedObject = cube; - //long t02 = System.currentTimeMillis(); - //System.out.println("getSoundingDataGeneric API took "+(t02-t01)+" ms in total"); - - return returnedObject; - } - - /* - * This API is for getting multiple locations sounding info at one shot. - * StnIdArray or StnNumArray is used as input stn info for each location. - * - * Chin Note: 02/27/12 obsoleting this one. Use getSoundingDataGeneric() - * - public Object getSoundingDataByStnArray() throws Exception { - Object returnedObject = new Object(); - //System.out.println ( " getSoundingData "); - - - NcSoundingCube cube = new NcSoundingCube(); - List soundingProfileList = new ArrayList(); - SndQueryKeyType sndQuery; - String[] stnArray; - if(queryType.equals(SndQueryKeyType.STNID.toString())){ - sndQuery = SndQueryKeyType.STNID; - stnArray = stnIdArr.clone(); - - } - else if(queryType.equals(SndQueryKeyType.STNNUM.toString())){ - sndQuery = SndQueryKeyType.STNNUM; - stnArray = stnNumArr.clone(); - } - else { - returnedObject = null; - return returnedObject; - } - if(stnArray.length <= 0){ - returnedObject = null; - return returnedObject; - } - List timeLineStrList=new ArrayList(); - List timeLimeCalList = new ArrayList(); - if(validTimeEnd !=0 && validTimeEnd > validTimeStart){ - //range of time line request - timeLimeCalList = ObservedSoundingQuery.getObservedSndTimeRangeList(sndType, validTimeStartCal, validTimeEndCal); - for (int i=0; i< timeLimeCalList.size(); i++){ - Calendar timeCal = timeLimeCalList.get(i); - String timeStr = String.format("%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS", timeCal); - timeLineStrList.add(timeStr); - - } - } - else { - //one single time line - timeLineStrList.add(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(refTimeCal.getTime())); - timeLimeCalList.add(refTimeCal); - } - String stn; - for ( int i=0; i < stnArray.length ; i++) - { - - stn = stnArray[i]; - stn.toUpperCase(Locale.ENGLISH); - //System.out.println ( "Request getSoundingData at " + stn); - MergeSounding ms = new MergeSounding(); - for (int j=0; j< timeLineStrList.size(); j++){ - String timeStr = timeLineStrList.get(j); - Calendar timeCal = timeLimeCalList.get(j); - - List sls = new ArrayList(); - List ttaa = new ArrayList(); - List ttbb = new ArrayList(); - List ttcc = new ArrayList(); - List ttdd = new ArrayList(); - List ppaa = new ArrayList(); - List ppbb = new ArrayList(); - List ppcc = new ArrayList(); - List ppdd = new ArrayList(); - List trop_a = new ArrayList(); - List trop_c = new ArrayList(); - List wmax_a = new ArrayList(); - List wmax_c = new ArrayList(); - - NcSoundingProfile pf = null; - if (sndType.equals(ObsSndType.NCUAIR.toString())){ - //System.out.println("getSoundingDataByLatLonArray:NcUair: lat="+lat+ " lon="+lon); - if ( merge == 0 ) { - //Chin...need more coding - pf = null; - } - else{ - - long t001 = System.currentTimeMillis(); - //get TTAA & TROPOPAUSE_A & MAXWIND_A - NcUairRecord record = ObservedSoundingQuery.getObservedSndNcUairData(lat, lon, "", timeStr, "TTAA", sndQuery); - if(record != null){ - ttaa = getSndLayersFromNcUairRecordObsLevel(record); - trop_a = getSndLayersFromNcUairRecordTrop(record); - wmax_a = getSndLayersFromNcUairRecordMaxw(record); -} - //get TTCC & TROPOPAUSE_C & MAXWIND_C - record = ObservedSoundingQuery.getObservedSndNcUairData(0d, 0d, stn, timeStr, "TTCC", sndQuery); - if(record != null){ - ttcc = getSndLayersFromNcUairRecordObsLevel(record); - trop_c = getSndLayersFromNcUairRecordTrop(record); - wmax_c = getSndLayersFromNcUairRecordMaxw(record); -} - //get TTBB - record = ObservedSoundingQuery.getObservedSndNcUairData(0d, 0d, stn, timeStr, "TTBB", sndQuery); - if(record != null){ - ttbb = getSndLayersFromNcUairRecordObsLevel(record); -} - //get TTDD - record = ObservedSoundingQuery.getObservedSndNcUairData(0d, 0d, stn, timeStr, "TTDD", sndQuery); - if(record != null){ - ttdd = getSndLayersFromNcUairRecordObsLevel(record); -} - //get PPAA - record = ObservedSoundingQuery.getObservedSndNcUairData(0d, 0d, stn, timeStr, "PPAA", sndQuery); - if(record != null){ - ppaa = getSndLayersFromNcUairRecordObsLevel(record); -} - //get PPBB - record = ObservedSoundingQuery.getObservedSndNcUairData(0d, 0d, stn, timeStr, "PPBB", sndQuery); - if(record != null){ - ppbb = getSndLayersFromNcUairRecordObsLevel(record); -} - //get PPCC - record = ObservedSoundingQuery.getObservedSndNcUairData(0d, 0d, stn, timeStr, "PPCC", sndQuery); - if(record != null){ - ppcc = getSndLayersFromNcUairRecordObsLevel(record); -} - //get PPDD - record = ObservedSoundingQuery.getObservedSndNcUairData(0d, 0d, stn, timeStr, "PPDD", sndQuery); - if(record != null){ - ppdd = getSndLayersFromNcUairRecordObsLevel(record); -} - pf = ObservedSoundingQuery.getObservedSndStnInfo(0d, 0d, stn,sndType, refTimeCal,sndQuery); - long t02 = System.currentTimeMillis(); - System.out.println("NcUair (by stn) profile retreival took " + (t02 - t001)); - sls = ms.mergeUairSounding(level,ttaa,ttbb,ttcc,ttdd,ppaa,ppbb,ppcc,ppdd,trop_a,trop_c,wmax_a,wmax_c,pf.getStationElevation()); - //System.out.println("NcUair Number of Layers:"+sls.size()); - //for(NcSoundingLayer ly: sls){ - // System.out.println("Pre= "+ly.getPressure()+ " Dew= "+ ly.getDewpoint()+ " T= "+ ly.getTemperature()+" H="+ly.getGeoHeight()+" WSp="+ly.getWindSpeed()); - //} - - pf.setSoundingLyLst(sls); - } - } - else if (//sndType.equals(ObsSndType.UAIR.toString()) || - sndType.equals(ObsSndType.DROP.toString()) || - sndType.equals(ObsSndType.TAMDAR.toString())) { - - if ( merge == 0 ) { - // ms.unMergedUairSounding - //System.out.println ( " Request unmerged data"); - if(dataType.equals(DataType.ALLDATA.toString())) - pf = ObservedSoundingQuery.getObservedSndAllData(0d, 0d, stn, timeCal, sndType, sndQuery); - else - pf = ObservedSoundingQuery.getObservedSndData(0d, 0d, stn, timeCal, sndType, dataType, sndQuery); - - - } else { - - // Get TTAA. If not existent, try ship data (UUAA). If level is not null or missing, - // the body of code will return a sounding list with MAN data or single level data. - //*System.out.println ( " Request merged data at lat="+ lat+" lon="+lon+ " refT="+ refTimeCal.getTime().toGMTString()); - - // TO DO -----> add station ID and station number and a list of stations queries. - pf = ObservedSoundingQuery.getObservedSndData(0d, 0d, stn, timeCal, sndType, "TTAA", sndQuery); - ttaa = pf.getSoundingLyLst(); - if (ttaa.size() == 0) { - ttaa = ObservedSoundingQuery.getObservedSndData(0d, 0d, stn, timeCal, sndType, "UUAA", sndQuery).getSoundingLyLst(); - } - - ttbb = ObservedSoundingQuery.getObservedSndData(0d, 0d, stn, timeCal, sndType, "TTBB", sndQuery).getSoundingLyLst(); - if (ttbb.size() == 0) { - ttbb = ObservedSoundingQuery.getObservedSndData(0d, 0d, stn, timeCal, sndType, "UUBB", sndQuery).getSoundingLyLst(); - } - - ttcc = ObservedSoundingQuery.getObservedSndData(0d, 0d, stn, timeCal, sndType, "TTCC", sndQuery).getSoundingLyLst(); - if (ttcc.size() == 0) { - ttcc = ObservedSoundingQuery.getObservedSndData(0d, 0d, stn, timeCal, sndType, "UUCC", sndQuery).getSoundingLyLst(); - } - - ttdd = ObservedSoundingQuery.getObservedSndData(0d, 0d, stn, timeCal, sndType, "TTDD", sndQuery).getSoundingLyLst(); - if (ttdd.size() == 0) { - ttdd = ObservedSoundingQuery.getObservedSndData(0d, 0d, stn, timeCal, sndType, "UUDD", sndQuery).getSoundingLyLst(); - } - - ppaa = ObservedSoundingQuery.getObservedSndData(0d, 0d, stn, timeCal, sndType, "PPAA", sndQuery).getSoundingLyLst(); - ppbb = ObservedSoundingQuery.getObservedSndData(0d, 0d, stn, timeCal, sndType, "PPBB", sndQuery).getSoundingLyLst(); - ppcc = ObservedSoundingQuery.getObservedSndData(0d, 0d, stn, timeCal, sndType, "PPCC", sndQuery).getSoundingLyLst(); - ppdd = ObservedSoundingQuery.getObservedSndData(0d, 0d, stn, timeCal, sndType, "PPDD", sndQuery).getSoundingLyLst(); - wmax_a = ObservedSoundingQuery.getObservedSndData(0d, 0d, stn, timeCal, sndType, "MAXWIND_A", sndQuery).getSoundingLyLst(); - wmax_c = ObservedSoundingQuery.getObservedSndData(0d, 0d, stn, timeCal, sndType, "MAXWIND_C", sndQuery).getSoundingLyLst(); - trop_a = ObservedSoundingQuery.getObservedSndData(0d, 0d, stn, timeCal, sndType, "TROPOPAUSE_A", sndQuery).getSoundingLyLst(); - trop_c = ObservedSoundingQuery.getObservedSndData(0d, 0d, stn, timeCal, sndType, "TROPOPAUSE_C", sndQuery).getSoundingLyLst(); - pf = ObservedSoundingQuery.getObservedSndStnInfo(0d, 0d,stn,sndType, timeCal,sndQuery); - sls = ms.mergeUairSounding(level,ttaa,ttbb,ttcc,ttdd,ppaa,ppbb,ppcc,ppdd,trop_a,trop_c,wmax_a,wmax_c,pf.getStationElevation()); - pf.setSoundingLyLst(sls); - } - - } - else if(sndType.equals(ObsSndType.BUFRUA.toString())){ - if ( merge == 0 ) { - // ms.unMergedUairSounding - //*System.out.println ( " Request unmerged data"); - if(dataType.equals(DataType.ALLDATA.toString())) - pf = ObservedSoundingQuery.getObservedSndBufruaAllData(0d, 0d, stn, refTimeCal, sndQuery); - else - pf = ObservedSoundingQuery.getObservedSndBufruaData(0d, 0d, stn, refTimeCal, dataType, sndQuery); - - } else { - - // Get TTAA. If not existent, try ship data (UUAA). If level is not null or missing, - // the b0dy of c0de will return a sounding list with MAN data or single level data. - //*System.out.println ( " Request merged data at lat="+ lat+" lon="+lon+ " refT="+ refTimeCal.getTime().toGMTString()); - - pf = ObservedSoundingQuery.getObservedSndBufruaData(0d, 0d, stn, refTimeCal,"TTAA", sndQuery); - ttaa = pf.getSoundingLyLst(); - ttbb = ObservedSoundingQuery.getObservedSndBufruaData(0d, 0d, stn, refTimeCal, "TTBB", sndQuery).getSoundingLyLst(); - ttcc = ObservedSoundingQuery.getObservedSndBufruaData(0d, 0d, stn, refTimeCal, "TTCC", sndQuery).getSoundingLyLst(); - ttdd = ObservedSoundingQuery.getObservedSndBufruaData(0d, 0d, stn, refTimeCal, "TTDD", sndQuery).getSoundingLyLst(); - //ppaa = ObservedSoundingQuery.getObservedSndBufruaData(0d, 0d, stn, refTimeCal, "PPAA", sndQuery).getSoundingLyLst(); - ppbb = ObservedSoundingQuery.getObservedSndBufruaData(0d, 0d, stn, refTimeCal, "PPBB", sndQuery).getSoundingLyLst(); - //ppcc = ObservedSoundingQuery.getObservedSndBufruaData(0d, 0d, stn, refTimeCal, "PPCC", sndQuery).getSoundingLyLst(); - ppdd = ObservedSoundingQuery.getObservedSndBufruaData(0d, 0d, stn, refTimeCal, "PPDD", sndQuery).getSoundingLyLst(); - wmax_a = ObservedSoundingQuery.getObservedSndBufruaData(0d, 0d, stn, refTimeCal, "MAXWIND_A", sndQuery).getSoundingLyLst(); - wmax_c = ObservedSoundingQuery.getObservedSndBufruaData(0d, 0d, stn, refTimeCal, "MAXWIND_C", sndQuery).getSoundingLyLst(); - trop_a = ObservedSoundingQuery.getObservedSndBufruaData(0d, 0d, stn, refTimeCal, "TROPOPAUSE_A", sndQuery).getSoundingLyLst(); - trop_c = ObservedSoundingQuery.getObservedSndBufruaData(0d, 0d, stn, refTimeCal, "TROPOPAUSE_C", sndQuery).getSoundingLyLst(); - pf = ObservedSoundingQuery.getObservedSndStnInfo(0d, 0d,stn,sndType, refTimeCal,sndQuery); - sls = ms.mergeUairSounding(level,ttaa,ttbb,ttcc,ttdd,ppaa,ppbb,ppcc,ppdd,trop_a,trop_c,wmax_a,wmax_c,pf.getStationElevation()); - pf.setSoundingLyLst(sls); - } - } - else if(sndType.equals(PfcSndType.NAMSND.toString()) || - sndType.equals(PfcSndType.GFSSND.toString()) || - sndType.equals(PfcSndType.RUCPTYPSND.toString()) || - sndType.equals(PfcSndType.RUC2SND.toString())) { - //*System.out.println ( " Processing native model data"); - pf = PfcSoundingQuery.getPfcSndData(0d,0d, stn, refTimeCal, validTimeStartCal, sndType,sndQuery); - ms.nativeModelSounding(pf.getSoundingLyLst(), pf.getStationElevation()); - if ( ms.isNumber (level) == 0 ) { - //level is an integer >=0. It means user request a single level - float rlev = new Integer(Integer.parseInt(level.trim())).floatValue(); - pf.setSoundingLyLst(ms.getSingLevel(rlev, pf.getSoundingLyLst())); - } else if ( ms.isNumber (level) == 1 ) { - //level is an float >=0. It also means user request a single level - float rlev = new Float(Float.parseFloat(level.trim())); - pf.setSoundingLyLst(ms.getSingLevel(rlev, pf.getSoundingLyLst())); - } - - } - else if(sndType.equals(MdlSndType.ANY.toString())) { - //model sounding query by stn is not supported yet - pf = null; - } - else { - pf = null; - } - if(pf != null && pf.getSoundingLyLst().size()>0) { - soundingProfileList.add(pf); - pf.setStationId(stn); - - pf = null; - } - } - } - if(soundingProfileList.size() == 0 ) - cube.setRtnStatus(NcSoundingCube.QueryStatus.FAILED); - else - cube.setRtnStatus(NcSoundingCube.QueryStatus.OK); - - cube.setSoundingProfileList(soundingProfileList); - returnedObject = cube; - - - return returnedObject; - } - */ - public Object getModels() throws Exception { - Object returnedObject = new Object(); - NcSoundingModel mdls = MdlSoundingQuery.getMdls(pluginName); - returnedObject = mdls; - return returnedObject; - } - /* Chin: this is not completed yet.... - * When use point data query for bufrua is supported, then we have to work on this one. - * - */ - private List processQueryReturnedBufruaData(List uairRecordArrList, boolean useNcSndLayer2){ - List soundingProfileList = new ArrayList(0); - /* - if ( merge == 0 ) { - return soundingProfileList; - - } - else { - for(UAObs[] recordArray:uairRecordArrList){ - - NcSoundingProfile pf; - - pf = new NcSoundingProfile(); - if(useNcSndLayer2== true){ - //need more code - } - else { - if(recordArray != null && recordArray.length >0){ - MergeSounding ms = new MergeSounding(); - List sls = new ArrayList(); - List ttaa = new ArrayList(); - List ttbb = new ArrayList(); - List ttcc = new ArrayList(); - List ttdd = new ArrayList(); - List ppaa = new ArrayList(); - List ppbb = new ArrayList(); - List ppcc = new ArrayList(); - List ppdd = new ArrayList(); - List trop_a = new ArrayList(); - List trop_c = new ArrayList(); - List wmax_a = new ArrayList(); - List wmax_c = new ArrayList(); - - for(int k=0; k< recordArray.length; k++){ - UAObs record= recordArray[k]; - if(record.getReportType() == NcSoundingLayer.dataTypeMap.get("TTAA")){ - ttaa = getSndLayersFromNcUairRecordObsLevel(record); - trop_a = getSndLayersFromNcUairRecordTrop(record); - wmax_a = getSndLayersFromNcUairRecordMaxw(record); - } - else if(record.getDataType().equals("TTBB")){ - ttbb = getSndLayersFromNcUairRecordObsLevel(record); - } - else if(record.getDataType().equals("TTCC")){ - ttcc = getSndLayersFromNcUairRecordObsLevel(record); - trop_c = getSndLayersFromNcUairRecordTrop(record); - wmax_c = getSndLayersFromNcUairRecordMaxw(record); - } - else if(record.getDataType().equals("TTDD")){ - ttdd = getSndLayersFromNcUairRecordObsLevel(record); - } - else if(record.getDataType().equals("PPAA")){ - ppaa= getSndLayersFromNcUairRecordObsLevel(record); - } - else if(record.getDataType().equals("PPBB")){ - ppbb = getSndLayersFromNcUairRecordObsLevel(record); - } - else if(record.getDataType().equals("PPCC")){ - ppcc = getSndLayersFromNcUairRecordObsLevel(record); - } - else if(record.getDataType().equals("PPDD")){ - ppdd = getSndLayersFromNcUairRecordObsLevel(record); - } - } - pf = new NcSoundingProfile(); - pf.setStationElevation((float)recordArray[0].getElevation()); - pf.setStationId(recordArray[0].getStationId()); - if(recordArray[0].getStnum() != null && recordArray[0].getStnum().length()>0) - pf.setStationNum(Integer.parseInt(recordArray[0].getStnum())); - pf.setStationLatitude(recordArray[0].getLatitude()); - pf.setStationLongitude(recordArray[0].getLongitude()); - pf.setFcsTime(recordArray[0].getDataTime().getRefTime().getTime()); - //System.out.println(" input lat="+lat+" pf's lat="+pf.getStationLatitude()+" elv="+pf.getStationElevation()+" stnId="+pf.getStationId()); - sls = ms.mergeUairSounding(level,ttaa,ttbb,ttcc,ttdd,ppaa,ppbb,ppcc,ppdd,trop_a,trop_c,wmax_a,wmax_c,pf.getStationElevation()); - if (level.toUpperCase().equalsIgnoreCase("MAN") ) - pf.setSoundingLyLst(sls); - else if( ms.isNumber(level)>=0 ){ - if(sls.size() == 1){ - //System.out.println("NCUAIR get one layer using level = "+ level); - pf.setSoundingLyLst(sls); - } - else { - pf = null; - //System.out.println("NCUAIR get 0 layer using level = "+ level); - } - } - else { - if(sls.isEmpty() || sls.size() <=1) - pf = null; - else - pf.setSoundingLyLst(sls); - } - } - else - pf = null; - } - if(pf != null && (pf.getSoundingLyLst2().size()>0||pf.getSoundingLyLst().size()>0 )) { - //System.out.println(" pf is not null, so adding a profile to the list of NcSoundingProfiles "); - soundingProfileList.add(pf); - pf = null; - } - } - }*/ - return soundingProfileList; - } - - private List processQueryReturnedNcUairData(List uairRecordArrList, boolean useNcSndLayer2){ - List soundingProfileList = new ArrayList(0); - for(NcUairRecord[] recordArray:uairRecordArrList){ - - NcSoundingProfile pf; - - if ( merge == 0 ) { - //Chin...need more coding - pf = null; - } - else{ - pf = new NcSoundingProfile(); - if(useNcSndLayer2== true){ - //use NcSoundingLayer2 - if(recordArray != null && recordArray.length >0){ - MergeSounding2 ms2 = new MergeSounding2(); - List sls = new ArrayList(); - List ttaa = new ArrayList(); - List ttbb = new ArrayList(); - List ttcc = new ArrayList(); - List ttdd = new ArrayList(); - List ppaa = new ArrayList(); - List ppbb = new ArrayList(); - List ppcc = new ArrayList(); - List ppdd = new ArrayList(); - List trop_a = new ArrayList(); - List trop_c = new ArrayList(); - List wmax_a = new ArrayList(); - List wmax_c = new ArrayList(); - - for(int k=0; k< recordArray.length; k++){ - NcUairRecord record= recordArray[k]; - if(record.getDataType().equals("TTAA")){ - ttaa = getSoundingLayer2FromNcUairRecordObsLevel( record ); - trop_a = getSoundingLayer2FromNcUairRecordTrop( record); - wmax_a = getSoundingLayer2FromNcUairRecordMaxw(record ); - } - else if(record.getDataType().equals("TTBB")){ - ttbb = getSoundingLayer2FromNcUairRecordObsLevel(record); - } - else if(record.getDataType().equals("TTCC")){ - ttcc = getSoundingLayer2FromNcUairRecordObsLevel( record ); - trop_c = getSoundingLayer2FromNcUairRecordTrop( record ); - wmax_c = getSoundingLayer2FromNcUairRecordMaxw( record ); - } - else if(record.getDataType().equals("TTDD")){ - ttdd = getSoundingLayer2FromNcUairRecordObsLevel(record); - } - else if(record.getDataType().equals("PPAA")){ - ppaa= getSoundingLayer2FromNcUairRecordObsLevel(record); - } - else if(record.getDataType().equals("PPBB")){ - ppbb = getSoundingLayer2FromNcUairRecordObsLevel(record); - } - else if(record.getDataType().equals("PPCC")){ - ppcc = getSoundingLayer2FromNcUairRecordObsLevel(record); - } - else if(record.getDataType().equals("PPDD")){ - ppdd = getSoundingLayer2FromNcUairRecordObsLevel(record); - } - } - pf.setStationElevation((float)recordArray[0].getElevation()); - pf.setStationId(recordArray[0].getStationId()); - if(recordArray[0].getStnum() != null && recordArray[0].getStnum().length()>0) - pf.setStationNum(Integer.parseInt(recordArray[0].getStnum())); - pf.setStationLatitude(recordArray[0].getLatitude()); - pf.setStationLongitude(recordArray[0].getLongitude()); - pf.setFcsTime(recordArray[0].getDataTime().getRefTime().getTime()); - //System.out.println(" input lat="+lat+" pf's lat="+pf.getStationLatitude()+" elv="+pf.getStationElevation()+" stnId="+pf.getStationId()); - if(useNcSndLayer2) - sls = ms2.mergeUairSounding(level,ttaa,ttbb,ttcc,ttdd,ppaa,ppbb,ppcc,ppdd,trop_a,trop_c,wmax_a,wmax_c,pf.getStationElevation()); - - if (level.toUpperCase().equalsIgnoreCase("MAN") ){ - pf.setSoundingLyLst2( sls ); - // System.out.println("sls set to the sounding profile"); - } - else if( ms2.isNumber( level )>=0 ){ - if(sls.size() == 1){ - // System.out.println("NcUair get one layer using level = "+ level); - pf.setSoundingLyLst2( sls ); - } - else { - pf = null; - // System.out.println("NcUair get 0 layer using level = "+ level); - } - } - else { - if(sls.isEmpty() || sls.size() <=1){ - pf = null; - // System.out.println("not MAN level & sls is empty or 1"); - } - else{ - pf.setSoundingLyLst2 ( sls ); - // System.out.println("sls set to the sounding profile for level = " + level); - } - } - } - } - else{ - //use NcSoundingLayer - if(recordArray != null && recordArray.length >0){ - MergeSounding ms = new MergeSounding(); - List sls = new ArrayList(); - List ttaa = new ArrayList(); - List ttbb = new ArrayList(); - List ttcc = new ArrayList(); - List ttdd = new ArrayList(); - List ppaa = new ArrayList(); - List ppbb = new ArrayList(); - List ppcc = new ArrayList(); - List ppdd = new ArrayList(); - List trop_a = new ArrayList(); - List trop_c = new ArrayList(); - List wmax_a = new ArrayList(); - List wmax_c = new ArrayList(); - for(int k=0; k< recordArray.length; k++){ - NcUairRecord record= recordArray[k]; - if(record.getDataType().equals("TTAA")){ - ttaa = getSndLayersFromNcUairRecordObsLevel(record); - trop_a = getSndLayersFromNcUairRecordTrop(record); - wmax_a = getSndLayersFromNcUairRecordMaxw(record); - } - else if(record.getDataType().equals("TTBB")){ - ttbb = getSndLayersFromNcUairRecordObsLevel(record); - } - else if(record.getDataType().equals("TTCC")){ - ttcc = getSndLayersFromNcUairRecordObsLevel(record); - trop_c = getSndLayersFromNcUairRecordTrop(record); - wmax_c = getSndLayersFromNcUairRecordMaxw(record); - } - else if(record.getDataType().equals("TTDD")){ - ttdd = getSndLayersFromNcUairRecordObsLevel(record); - } - else if(record.getDataType().equals("PPAA")){ - ppaa= getSndLayersFromNcUairRecordObsLevel(record); - } - else if(record.getDataType().equals("PPBB")){ - ppbb = getSndLayersFromNcUairRecordObsLevel(record); - } - else if(record.getDataType().equals("PPCC")){ - ppcc = getSndLayersFromNcUairRecordObsLevel(record); - } - else if(record.getDataType().equals("PPDD")){ - ppdd = getSndLayersFromNcUairRecordObsLevel(record); - } - } - pf = new NcSoundingProfile(); - pf.setStationElevation((float)recordArray[0].getElevation()); - pf.setStationId(recordArray[0].getStationId()); - if(recordArray[0].getStnum() != null && recordArray[0].getStnum().length()>0) - pf.setStationNum(Integer.parseInt(recordArray[0].getStnum())); - pf.setStationLatitude(recordArray[0].getLatitude()); - pf.setStationLongitude(recordArray[0].getLongitude()); - pf.setFcsTime(recordArray[0].getDataTime().getRefTime().getTime()); - //System.out.println(" input lat="+lat+" pf's lat="+pf.getStationLatitude()+" elv="+pf.getStationElevation()+" stnId="+pf.getStationId()); - sls = ms.mergeUairSounding(level,ttaa,ttbb,ttcc,ttdd,ppaa,ppbb,ppcc,ppdd,trop_a,trop_c,wmax_a,wmax_c,pf.getStationElevation()); - //System.out.println("NCUAIR Number of Layers after merge:"+sls.size() + " level="+level + " ms.isNumber(level)="+ms.isNumber(level)); - //for(NcSoundingLayer ly: sls){ - // System.out.println("Pre= "+ly.getPressure()+ " Dew= "+ ly.getDewpoint()+ " T= "+ ly.getTemperature()+" H="+ly.getGeoHeight()+" WSp="+ly.getWindSpeed()); - //} - - if (level.toUpperCase().equalsIgnoreCase("MAN") ) - pf.setSoundingLyLst(sls); - else if( ms.isNumber(level)>=0 ){ - if(sls.size() == 1){ - //System.out.println("NCUAIR get one layer using level = "+ level); - pf.setSoundingLyLst(sls); - } - else { - pf = null; - //System.out.println("NCUAIR get 0 layer using level = "+ level); - } - } - else { - if(sls.isEmpty() || sls.size() <=1) - pf = null; - else - pf.setSoundingLyLst(sls); - } - } - else - pf = null; - } - if(pf != null && (pf.getSoundingLyLst2().size()>0||pf.getSoundingLyLst().size()>0 )) { - //System.out.println(" pf is not null, so adding a profile to the list of NcSoundingProfiles "); - soundingProfileList.add(pf); - pf = null; - } - } - } - return soundingProfileList; - } - /* - * Convert sounding data saved in NcSoundingLayer list to NcSoundingLayer2 list - * remove NcSoundingLayer data to have a smaller size for sending back to client - */ - private void convertPfcNcSoundingLayerToNcSoundingLayer2(List pfLst){ - for(NcSoundingProfile pf: pfLst){ - List soundLy2List = new ArrayList(); - for (NcSoundingLayer level : pf.getSoundingLyLst()) - { - NcSoundingLayer2 soundingLy2; - try { - soundingLy2 = new NcSoundingLayer2(); - AirTemperature airTemp; - airTemp = new AirTemperature(); - airTemp.setValue( new Amount ( level.getTemperature(), SI.CELSIUS ) ); - soundingLy2.setTemperature(airTemp); - - DewPointTemp dewPoint = new DewPointTemp(); - dewPoint.setValue( new Amount (level.getDewpoint(), SI.CELSIUS ) ); - soundingLy2.setDewpoint(dewPoint); - - PressureLevel pressure = new PressureLevel(); - pressure.setValue( new Amount (level.getPressure(), NcUnits.MILLIBAR )); - soundingLy2.setPressure(pressure); - - WindDirection windDirection = new WindDirection(); - windDirection.setValue(level.getWindDirection(), NonSI.DEGREE_ANGLE); - soundingLy2.setWindDirection(windDirection); - - WindSpeed windSpeed = new WindSpeed(); - // HDF5 data in unit of Knots, no conversion needed - windSpeed.setValue( level.getWindSpeed(), NonSI.KNOT); - soundingLy2.setWindSpeed(windSpeed); - - HeightAboveSeaLevel height = new HeightAboveSeaLevel(); - height.setValue(level.getGeoHeight(), SI.METER ); - soundingLy2.setGeoHeight(height); - - Omega omega = new Omega(); - omega.setValueAs(level.getOmega(), ""); - soundingLy2.setOmega(omega); - //soundingLy.setPressure(level.getPressure().floatValue()/100); - //soundingLy.setWindU(level.getUcWind().floatValue()); // HDF5 data in unit of Knots, no conversion needed - //soundingLy.setWindV(level.getVcWind().floatValue()); - //soundingLy.setSpecHumidity(level.getSpecificHumidity().floatValue()); - soundLy2List.add(soundingLy2); - } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - - } - //Collections.sort(soundLyList,reversePressureComparator()); - pf.setSoundingLyLst2(soundLy2List); - pf.getSoundingLyLst().clear(); - } - } - private void sysPrintProfileLayer2(List pfs){ - System.out.println("-----------------------------------------------------------------\n sysPrintProfileLayer2: profile size ="+ pfs.size()); - for(int i =0; i < pfs.size();i++){ - if(pfs.get(i).getStationId().indexOf('K') == 0){ - System.out.println("pf"+i+ " stn="+pfs.get(i).getStationId()+" lat/lon="+ pfs.get(i).getStationLatitude()+"/"+pfs.get(i).getStationLongitude()); - if(pfs.get(i).getSoundingLyLst2().size() >0){ - System.out.println(" temp="+pfs.get(i).getSoundingLyLst2().get(0).getTemperature()+" dewp="+pfs.get(i).getSoundingLyLst2().get(0).getDewpoint()+" press="+ - pfs.get(i).getSoundingLyLst2().get(0).getPressure() + " height="+pfs.get(i).getSoundingLyLst2().get(0).getGeoHeight()+ - " windSp="+pfs.get(i).getSoundingLyLst2().get(0).getWindSpeed()+" windDir="+pfs.get(i).getSoundingLyLst2().get(0).getWindDirection()+ - " omega="+pfs.get(i).getSoundingLyLst2().get(0).getOmega()); - } - } - } - } - + private Calendar refTimeCal, validTimeStartCal, validTimeEndCal; + + private String stid, level, dataType, sndType, queryType, tableName; + + private int merge; + + private boolean useNcSoundingLayer2 = false; + + private int[] dbIdList; + + private String[] stnIdArr; + + private String[] stnNumArr; + + private String modelName; + + private String pluginName; + + private double[][] latLonArray; // e.g. at nth element, lat=[n][0], + // lon=[n][1] + + private Coordinate[] coordinateArray; + + private long[] rangeTimeArr; + + private List rangeTimeCalLst = new ArrayList(); + + private List rangeTimeStringLst = new ArrayList(); + + public double[][] getLatLons() { + return latLonArray; + } + + public boolean isUseNcSoundingLayer2() { + return useNcSoundingLayer2; + } + + public void setUseNcSoundingLayer2(boolean useNcSoundingLayer2) { + this.useNcSoundingLayer2 = useNcSoundingLayer2; + // System.out.println("useNcSoundingLayer2 set to "+useNcSoundingLayer2); + } + + public long[] getRangeTimeArr() { + return rangeTimeArr; + } + + public void setRangeTimeArr(long[] rangeTimeArr) { + this.rangeTimeArr = rangeTimeArr; + rangeTimeStringLst.clear(); + rangeTimeCalLst.clear(); + for (int i = 0; i < rangeTimeArr.length; i++) { + Calendar timeCal = Calendar + .getInstance(TimeZone.getTimeZone("GMT")); + // reset time + timeCal.setTimeInMillis(rangeTimeArr[i]); + String tStr = String.format("%1$tY-%1$tm-%1$td %1$tH:00:00", + timeCal); + this.rangeTimeStringLst.add(tStr); + this.rangeTimeCalLst.add(timeCal); + // System.out.println("setRangeTimeArr: time in long="+rangeTimeArr[i]+ + // " in str="+tStr); + } + } + + public String[] getStnIdArr() { + return stnIdArr; + } + + public void setStnIdArr(String[] stnIdArr) { + this.stnIdArr = stnIdArr; + // stnId and coordinateArray (or latLonArray) should be mutual exclusive + coordinateArray = null; + latLonArray = null; + } + + public String[] getStnNumArr() { + return stnNumArr; + } + + public void setStnNumArr(String[] stnNumArr) { + this.stnNumArr = stnNumArr; + } + + public void setLatLons(double[] latLons) { + // from python script, I only know a way to pass one dimensional array, + // therefore convert it 2-D here. + if (latLons.length > 0) { + latLonArray = new double[latLons.length / 2][2]; + for (int i = 0, j = 0; i < latLons.length; i = i + 2) { + this.latLonArray[j][0] = latLons[i]; + this.latLonArray[j][1] = latLons[i + 1]; + j++; + // System.out.println("latlons = "+ latLonArray[j][0] + ","+ + // latLonArray[j][1]); + } + coordinateArray = new Coordinate[latLons.length / 2]; + for (int i = 0, j = 0; i < latLons.length; i = i + 2) { + Coordinate coor = new Coordinate(); + coor.y = latLons[i]; // latitude + coor.x = latLons[i + 1];// longitude + this.coordinateArray[j] = coor; + // System.out.println("i=" + i+ " j=" + j+" latlons = "+ + // latLons[i+1] + ","+ latLons[i]); + j++; + } + stnIdArr = null; // stnId and coordinateArray (or latLonArray) + // should be mutual exclusive + } + } + + /** The logger */ + protected final transient Log logger = LogFactory.getLog(getClass()); + + public String getRefTimeStr() { + return refTimeStr; + } + + /* + * Reference time String should have this format: "yyyy-mm-dd hh" + */ + public void setRefTimeStr(String refTimeStr) { + this.refTimeStr = refTimeStr; + refTimeCal = convertTimeStrToCalendar(refTimeStr); + + } + + public void setValidTimeStartStr(String validTimeStartStr) { + this.validTimeStartStr = validTimeStartStr; + validTimeStartCal = convertTimeStrToCalendar(validTimeStartStr); + } + + public void setValidTimeEndStr(String validTimeEndStr) { + this.validTimeEndStr = validTimeEndStr; + validTimeEndCal = convertTimeStrToCalendar(validTimeEndStr); + + } + + private Calendar convertTimeStrToCalendar(String intimeStr) { + int year, mon, date, hr; + String timeStr = new String(intimeStr); + int index = timeStr.indexOf('-'); + + if (index >= 4) { + year = Integer.parseInt(timeStr.substring(index - 4, index)); + timeStr = timeStr.substring(index + 1); + index = timeStr.indexOf('-'); + if (index >= 2) { + mon = Integer.parseInt(timeStr.substring(index - 2, index)); + timeStr = timeStr.substring(index + 1); + index = timeStr.indexOf(' '); + if (index >= 2) { + date = Integer + .parseInt(timeStr.substring(index - 2, index)); + timeStr = timeStr.substring(index + 1); + // index = refTimeStr.indexOf(':'); + if (timeStr.length() >= 2) { + hr = Integer.parseInt(timeStr.substring(0, 2)); + Calendar cal; + cal = Calendar.getInstance(TimeZone.getTimeZone("GMT")); + // reset time + cal.setTimeInMillis(0); + // set new time + cal.set(year, mon - 1, date, hr, 0, 0); + return cal; + } + } + } + } + return null; + } + + public void setQueryType(String queryType) { + this.queryType = queryType; + } + + public String getTimeLine() { + return timeLine; + } + + public void setTimeLine(String timeLine) { + this.timeLine = timeLine; + } + + public NcSoundingDrv() { + super(); + dbIdList = null; + level = "-9999"; + merge = 0; + queryType = "LATLON"; + dataType = "ALLDATA"; + } + + public String getTableName() { + return tableName; + } + + public void setTableName(String tableName) { + this.tableName = tableName; + + } + + public String getDataType() { + return dataType; + } + + public void setDataType(String dataType) { + this.dataType = dataType; + } + + public int[] getDbIdList() { + return dbIdList; + } + + public void setDbIdList(int[] dbIdList) { + this.dbIdList = dbIdList; + } + + public double getLat() { + return lat; + } + + public void setLat(double lat) { + this.lat = lat; + } + + public void setLevel(String level) { + this.level = level; + } + + public void setStid(String stid) { + this.stid = stid; + } + + public double getLon() { + return lon; + } + + public String getValidTimeStr() { + return validTimeStartStr; + } + + public String getStid() { + return stid; + } + + public void setLon(double lon) { + this.lon = lon; + } + + public void setMerge(int merge) { + // for native model sounding and model sounding, there is no need to + // merge. Set merge + // to false accordingly. + this.merge = merge; + } + + public long getRefTime() { + return refTime; + } + + public void setRefTime(long refTime) { + this.refTime = refTime; + Calendar timeCal = Calendar.getInstance(TimeZone.getTimeZone("GMT")); + // reset time + timeCal.setTimeInMillis(refTime); + refTimeStr = String.format("%1$tY-%1$tm-%1$td %1$tH:00:00", timeCal); + refTimeCal = Calendar.getInstance(TimeZone.getTimeZone("GMT")); + refTimeCal.setTimeInMillis(refTime); + } + + public long getValidTimeStart() { + return validTimeStart; + } + + public void setValidTimeStart(long validTimeStart) { + this.validTimeStart = validTimeStart; + validTimeStartCal = Calendar.getInstance(TimeZone.getTimeZone("GMT")); + validTimeStartCal.setTimeInMillis(validTimeStart); + } + + public long getValidTimeEnd() { + return validTimeEnd; + } + + public void setValidTimeEnd(long validTimeEnd) { + this.validTimeEnd = validTimeEnd; + validTimeEndCal = Calendar.getInstance(TimeZone.getTimeZone("GMT")); + validTimeEndCal.setTimeInMillis(validTimeEnd); + } + + public String getSndType() { + return sndType; + } + + public void setSndType(String sndType) { + this.sndType = sndType; + } + + boolean proces = true; + + public void setModelName(String aModelName) { + this.modelName = aModelName; + } + + public void setPluginName(String aPluginName) { + this.pluginName = aPluginName; + } + + public String getModelName() { + return modelName; + } + + public String getPluginName() { + return pluginName; + } + + // for static sounding type query + public Object getSoundingRangeTimeLine() throws Exception { + Object returnedObject = null; + if (sndType.equals(ObsSndType.NCUAIR.toString()) + || sndType.equals(ObsSndType.DROP.toString()) + || sndType.equals(ObsSndType.TAMDAR.toString())) { + + // *System.out.println ( + // "getSoundingTimeLine Processing UAIR request."); + returnedObject = ObservedSoundingQuery + .getObservedSndTimeLine(sndType); + } else if (sndType.equals(PfcSndType.NAMSND.toString()) + || sndType.equals(PfcSndType.GFSSND.toString())) { + returnedObject = PfcSoundingQuery.getPfcSndRangeTimeLine(sndType, + refTimeStr); + } + /* + * else if (sndType.equals(MdlSndType.GFSSNDMDL.toString())|| + * sndType.equals(MdlSndType.NAMSNDMDL.toString()) || + * sndType.equals(MdlSndType.RUC2SNDMDL.toString())|| + * sndType.equals(MdlSndType.NGMSNDMDL.toString()) || + * sndType.equals(MdlSndType.UKMETSNDMDL.toString())) { returnedObject = + * MdlSoundingQuery.getMdlSndRangeTimeLine(sndType, refTimeStr, + * tableName); } + */ + return returnedObject; + } + + // for static sounding type query + public Object getSoundingTimeLine() throws Exception { + Object returnedObject = null; + if (sndType.equals(ObsSndType.NCUAIR.toString()) + || sndType.equals(ObsSndType.BUFRUA.toString()) + || sndType.equals(ObsSndType.DROP.toString()) + || sndType.equals(ObsSndType.TAMDAR.toString())) { + + // *System.out.println ( + // "getSoundingTimeLine Processing UAIR request."); + returnedObject = ObservedSoundingQuery + .getObservedSndTimeLine(sndType); + } else if (sndType.equals(PfcSndType.NAMSND.toString()) + || sndType.equals(PfcSndType.GFSSND.toString())) { + returnedObject = PfcSoundingQuery.getPfcSndTimeLine(sndType); + + } /* + * else if (sndType.equals(MdlSndType.GFSSNDMDL.toString())|| + * sndType.equals(MdlSndType.NAMSNDMDL.toString()) || + * sndType.equals(MdlSndType.RUC2SNDMDL.toString())|| + * sndType.equals(MdlSndType.NGMSNDMDL.toString()) || + * sndType.equals(MdlSndType.UKMETSNDMDL.toString())) { returnedObject + * = MdlSoundingQuery.getMdlSndTimeLine(sndType, tableName); } + */ + + return returnedObject; + } + + // for model sounding query - its model type is returned during query time. + public Object getMdlSoundingRangeTimeLine() throws Exception { + Object returnedObject = null; + returnedObject = MdlSoundingQuery.getMdlSndRangeTimeLine(sndType, + refTimeStr, tableName); + return returnedObject; + } + + // for model sounding query - its model type is returned during query time. + public Object getMdlSoundingTimeLine() throws Exception { + Object returnedObject = null; + + returnedObject = MdlSoundingQuery.getMdlSndTimeLine(sndType, tableName); + + return returnedObject; + } + + public Object getSoundingStnInfoCol() throws Exception { + Object returnedObject = null; + // System.out.println ( "getSoundingStnInfoCol sndType ="+sndType); + NcSoundingStnInfoCollection stnInfoCol = null; + if (sndType.equals(ObsSndType.NCUAIR.toString()) + || sndType.equals(ObsSndType.BUFRUA.toString()) + || sndType.equals(ObsSndType.DROP.toString()) + || sndType.equals(ObsSndType.TAMDAR.toString())) { + stnInfoCol = ObservedSoundingQuery.getObservedSndStnInfoCol( + sndType, timeLine); + } else if (sndType.equals(PfcSndType.NAMSND.toString()) + || sndType.equals(PfcSndType.GFSSND.toString()) + || sndType.equals(PfcSndType.RUCPTYPSND.toString()) + || sndType.equals(PfcSndType.RUC2SND.toString())) { + stnInfoCol = PfcSoundingQuery.getPfcSndStnInfoCol(sndType, + timeLine, refTimeStr); + } + + else + return returnedObject; + + returnedObject = stnInfoCol; + return returnedObject; + } + + private List getSndLayersFromNcUairRecordObsLevel( + NcUairRecord record) { + List sndLayers = new ArrayList(); + Set obLevels = record.getObsLevels(); + // System.out.println("The datauri for this record is: " + + // record.getDataURI() ); + if (obLevels.size() > 0) { + for (NcUairObsLevels obLev : obLevels) { + NcSoundingLayer sndLayer = new NcSoundingLayer(); + sndLayer.setTemperature(obLev.getTemp()); + sndLayer.setDewpoint(obLev.getDwpt()); + sndLayer.setGeoHeight(obLev.getHght()); + // System.out.println("Sounding layer height = " + + // sndLayer.getGeoHeight() ); + sndLayer.setPressure(obLev.getPres()); + sndLayer.setWindDirection(obLev.getDrct()); + if (obLev.getSped() >= 0) + sndLayer.setWindSpeed((float) metersPerSecondToKnots + .convert(obLev.getSped())); + else + sndLayer.setWindSpeed(obLev.getSped()); + sndLayers.add(sndLayer); + } + } + // System.out.println("ObsLevel="+obLevels.size()+" sndLayers="+sndLayers.size()); + return sndLayers; + } + + private List getSoundingLayer2FromNcUairRecordObsLevel( + NcUairRecord record) { + List sndLayers = new ArrayList(); + Set obLevels = record.getObsLevels(); + + // System.out.println("The datatype for this record is: " + + // record.getDataType() ); + if (obLevels.size() > 0) { + for (NcUairObsLevels obLev : obLevels) { + // System.out.println("\n\nFrom NcUairObsLevel:"); + // System.out.println("Temperature = " + obLev.getTemp()); + // System.out.println("Pressure = " + obLev.getPres()); + // System.out.println("Dewpoint = " + obLev.getDwpt()); + // System.out.println("Height = " + obLev.getHght()); + // System.out.println("Wind direction = " + obLev.getDrct()); + // System.out.println("Wind speed in m/s= " + obLev.getSped()); + try { + NcSoundingLayer2 sndLayer = new NcSoundingLayer2(); + /* + * (Non-Javadoc) The units for each quantity are chosen + * based upon the units defined for these quantities in the + * pointdata description file for NcUair + */ + AirTemperature airTemp = new AirTemperature(); + airTemp.setValue(new Amount(obLev.getTemp(), SI.CELSIUS)); + DewPointTemp dewPoint = new DewPointTemp(); + dewPoint.setValue(new Amount(obLev.getDwpt(), SI.CELSIUS)); + HeightAboveSeaLevel height = new HeightAboveSeaLevel(); + height.setValue(obLev.getHght(), SI.METER); + + // System.out.println("Sounding layer height = " + + // sndLayer.getGeoHeight().doubleValue() ); + PressureLevel pressure = new PressureLevel(); + pressure.setValue(new Amount(obLev.getPres(), + NcUnits.MILLIBAR)); + + WindDirection windDirection = new WindDirection(); + windDirection.setValue(obLev.getDrct(), NonSI.DEGREE_ANGLE); + WindSpeed windSpeed = new WindSpeed(); + float speed = obLev.getSped(); + + /* + * ( Non-Javadoc ) There are no negative speed values + * decoded except for either -999 or -9999 to indicate that + * the speed is missing. The check for the positive speed + * value ensures that the unit conversion happens for + * non-missing speed values. + */ + if (speed >= 0) { + double convertedSpeed = metersPerSecondToKnots + .convert(speed); + windSpeed.setValue(convertedSpeed, NonSI.KNOT); + } else { + windSpeed.setValueToMissing(); + } + + // System.out.println("\nFrom MetParameters:"); + // System.out.println("Temperature = " + + // airTemp.getValue().floatValue()); + // System.out.println("Pressure = " + + // pressure.getValue().floatValue()); + // System.out.println("Dewpoint = " + + // dewPoint.getValue().floatValue()); + // System.out.println("Height = " + + // height.getValue().floatValue()); + // System.out.println("Wind direction = " + + // windDirection.getValue().floatValue()); + // System.out.println("Wind speed = " + + // windSpeed.getValue().floatValue()); + sndLayer.setTemperature(airTemp); + sndLayer.setPressure(pressure); + sndLayer.setDewpoint(dewPoint); + sndLayer.setGeoHeight(height); + sndLayer.setWindDirection(windDirection); + sndLayer.setWindSpeed(windSpeed); + sndLayers.add(sndLayer); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + // System.out.println("ObsLevel="+obLevels.size()+" sndLayers="+sndLayers.size()); + return sndLayers; + } + + private List getSndLayersFromNcUairRecordTrop( + NcUairRecord record) { + List sndLayers = new ArrayList(); + Set trops = record.getTropopause(); + if (trops.size() > 0) { + for (NcUairTropopause trop : trops) { + NcSoundingLayer sndLayer = new NcSoundingLayer(); + sndLayer.setTemperature(trop.getTemp()); + sndLayer.setDewpoint(trop.getDwpt()); + sndLayer.setPressure(trop.getPres()); + sndLayer.setWindDirection(trop.getDrct()); + if (trop.getSped() >= 0) + sndLayer.setWindSpeed((float) metersPerSecondToKnots + .convert(trop.getSped())); + else + sndLayer.setWindSpeed(trop.getSped()); + sndLayers.add(sndLayer); + } + } + // System.out.println("trops="+trops.size()+" sndLayers="+sndLayers.size()); + return sndLayers; + } + + private List getSoundingLayer2FromNcUairRecordTrop( + NcUairRecord record) { + List sndLayers = new ArrayList(); + Set trops = record.getTropopause(); + if (trops.size() > 0) { + for (NcUairTropopause trop : trops) { + try { + NcSoundingLayer2 sndLayer = new NcSoundingLayer2(); + /* + * (Non-Javadoc) The units for each quantity are chosen + * based upon the units defined for these quantities in the + * pointdata description file for NcUair + */ + AirTemperature airTemp = new AirTemperature(); + airTemp.setValue(new Amount(trop.getTemp(), SI.CELSIUS)); + DewPointTemp dewPoint = new DewPointTemp(); + dewPoint.setValue(new Amount(trop.getDwpt(), SI.CELSIUS)); + PressureLevel pressure = new PressureLevel(); + pressure.setValue(new Amount(trop.getPres(), + NcUnits.MILLIBAR)); + WindDirection windDirection = new WindDirection(); + windDirection.setValue(trop.getDrct(), NonSI.DEGREE_ANGLE); + WindSpeed windSpeed = new WindSpeed(); + float speed = trop.getSped(); + /* + * ( Non-Javadoc ) There are no negative speed values + * decoded except for either -999 or -9999 to indicate that + * the speed is missing. The check for the positive speed + * value ensures that the unit conversion happens for + * non-missing speed values. + */ + if (speed >= 0) { + double convertedSpeed = metersPerSecondToKnots + .convert(speed); + windSpeed.setValue(convertedSpeed, NonSI.KNOT); + } else { + windSpeed.setValueToMissing(); + } + sndLayer.setTemperature(airTemp); + sndLayer.setPressure(pressure); + sndLayer.setDewpoint(dewPoint); + sndLayer.setWindDirection(windDirection); + sndLayer.setWindSpeed(windSpeed); + sndLayers.add(sndLayer); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + // System.out.println("trops="+trops.size()+" sndLayers="+sndLayers.size()); + return sndLayers; + } + + private List getSndLayersFromNcUairRecordMaxw( + NcUairRecord record) { + List sndLayers = new ArrayList(); + Set maxWinds = record.getMaxWind(); + if (maxWinds.size() > 0) { + for (NcUairMaxWind maxWind : maxWinds) { + NcSoundingLayer sndLayer = new NcSoundingLayer(); + sndLayer.setPressure(maxWind.getPres()); + sndLayer.setWindDirection(maxWind.getDrct()); + if (maxWind.getSped() >= 0) + sndLayer.setWindSpeed((float) metersPerSecondToKnots + .convert(maxWind.getSped())); + else + sndLayer.setWindSpeed(maxWind.getSped()); + sndLayers.add(sndLayer); + } + } + // System.out.println("maxWinds="+maxWinds.size()+" sndLayers="+sndLayers.size()); + return sndLayers; + } + + private List getSoundingLayer2FromNcUairRecordMaxw( + NcUairRecord record) { + List sndLayers = new ArrayList(); + Set maxWinds = record.getMaxWind(); + if (maxWinds.size() > 0) { + /* + * (Non-Javadoc) The units for each quantity are chosen based upon + * the units defined for these quantities in the pointdata + * description file for NcUair + */ + for (NcUairMaxWind maxWind : maxWinds) { + try { + NcSoundingLayer2 sndLayer = new NcSoundingLayer2(); + PressureLevel pressure = new PressureLevel(); + // pressure.setValueAs(maxWind.getPres(), "hPa" ); + pressure.setValue(new Amount(maxWind.getPres(), + NcUnits.MILLIBAR)); + WindDirection windDirection = new WindDirection(); + windDirection.setValue(maxWind.getDrct(), + NonSI.DEGREE_ANGLE); + WindSpeed windSpeed = new WindSpeed(); + float speed = maxWind.getSped(); + /* + * ( Non-Javadoc ) There are no negative speed values + * decoded except for either -999 or -9999 to indicate that + * the speed is missing. The check for the positive speed + * value ensures that the unit conversion happens for + * non-missing speed values. + */ + if (speed >= 0) { + double convertedSpeed = metersPerSecondToKnots + .convert(speed); + windSpeed.setValue(convertedSpeed, NonSI.KNOT); + } else { + windSpeed.setValueToMissing(); + } + sndLayer.setPressure(pressure); + sndLayer.setWindDirection(windDirection); + sndLayer.setWindSpeed(windSpeed); + sndLayers.add(sndLayer); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + // System.out.println("maxWinds="+maxWinds.size()+" sndLayers="+sndLayers.size()); + return sndLayers; + } + + /* + * CHin: 2012 Feb 13: Support PFC sounding with one lat/lon location + * only..... Query PFC sounding data in one shot. to see performce + * difference + * + * public Object getSoundingDataByRangeTimeArray() throws Exception { //long + * t01 = System.currentTimeMillis(); Object returnedObject = new Object(); + * //System.out.println ( " getSoundingDataByLatLonArray "); + * + * + * //MergeSounding ms = new MergeSounding(); NcSoundingCube cube = new + * NcSoundingCube(); //List soundingProfileList = new + * ArrayList(); NcSoundingCube.QueryStatus + * failedRtnStatus = NcSoundingCube.QueryStatus.FAILED; Coordinate[] + * coorArray = new Coordinate[1]; Coordinate latLon = new Coordinate(); + * latLon.y= lat; latLon.x= lon; coorArray[0]=latLon; + * //List + * pfs2=PfcSoundingQuery.getPfcSndDataBySoundTimeRangeArray(lat, lon, null, + * refTimeStr, rangeTimeStringLst, sndType, SndQueryKeyType.LATLON); + * List + * pfs=PfcSoundingQuery.getPfcSndDataGeneric(coorArray, null, refTimeStr, + * rangeTimeStringLst, sndType,level); + * + * if(pfs.size() == 0 ) cube.setRtnStatus(failedRtnStatus); else + * cube.setRtnStatus(NcSoundingCube.QueryStatus.OK); + * + * cube.setSoundingProfileList(pfs); returnedObject = cube; + * + * //long t02 = System.currentTimeMillis(); + * //System.out.println("PFC/OBS cube retreival took " + (t02 - t01)); + * return returnedObject; } + */ + /* + * This API is for getting multiple locations sounding info at one shot. + * latLonArray is used to input lat/lon for each location. + * + * Chin's Note @ 02/27/2012 This API is currently only used for query grid + * and bufrua data by Nsharp. + */ + private Object getSoundingDataByLatLonArray() throws Exception { + // long t01 = System.currentTimeMillis(); + Object returnedObject = new Object(); + // System.out.println ( " getSoundingDataByLatLonArray entered"); + + List timeLineStrList = new ArrayList(); + List timeLimeCalList = new ArrayList(); + + NcSoundingCube cube = new NcSoundingCube(); + List soundingProfileList = new ArrayList(); + SndQueryKeyType sndQuery = SndQueryKeyType.LATLON; + NcSoundingCube.QueryStatus failedRtnStatus = NcSoundingCube.QueryStatus.FAILED; + MergeSounding ms = new MergeSounding(); + NcSoundingProfile pf = null; + if (sndType.equals(MdlSndType.ANY.toString())) { + // temp fix for now... + if (validTimeEnd != 0 && validTimeEnd > validTimeStart) { + // range of time line request + timeLimeCalList = ObservedSoundingQuery + .getObservedSndTimeRangeList(sndType, + validTimeStartCal, validTimeEndCal); + for (int i = 0; i < timeLimeCalList.size(); i++) { + Calendar timeCal = timeLimeCalList.get(i); + String timeStr = String.format( + "%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS", timeCal); + timeLineStrList.add(timeStr); + + } + } else { + // one single time line + timeLineStrList.add(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") + .format(refTimeCal.getTime())); + timeLimeCalList.add(refTimeCal); + } + if (latLonArray != null) { + /* + * old way for ( int i=0; i < latLonArray.length ; i++) { double + * lat = latLonArray[i][0]; double lon = latLonArray[i][1]; for + * (int j=0; j< timeLineStrList.size(); j++){ String timeStr = + * timeLineStrList.get(j); pf = MdlSoundingQuery.getMdlSndData( + * lat, lon, timeStr, validTimeStartStr, pluginName, modelName + * ); if(pf.getRtnStatus() != NcSoundingCube.QueryStatus.OK){ + * failedRtnStatus = pf.getRtnStatus(); pf = null; } if(pf != + * null && pf.getSoundingLyLst().size()>0) { + * soundingProfileList.add(pf); pf = null; } } } + */ + // Chin Note: using new API to query multiple Points at one shot + soundingProfileList = MdlSoundingQuery + .getMdlSndDataProfileList(latLonArray, + timeLineStrList.get(0), validTimeStartStr, + pluginName, modelName); + } + } else if (sndType.equals(ObsSndType.BUFRUA.toString())) { + int arrLen = 0; + if (latLonArray != null) { + arrLen = latLonArray.length; + sndQuery = SndQueryKeyType.LATLON; + } else if (stnIdArr != null) { + arrLen = stnIdArr.length; + sndQuery = SndQueryKeyType.STNID; + } + double lat = 0, lon = 0; + String stnId = ""; + for (int i = 0; i < arrLen; i++) { + + // Calendar timeCal = timeLimeCalList.get(j); + + if (latLonArray != null) { + // make sure we have right precision... + lat = latLonArray[i][0]; + lon = latLonArray[i][1]; + } else { + stnId = stnIdArr[i]; + } + /* + * Process sounding data. + */ + + List sls = new ArrayList(); + List ttaa = new ArrayList(); + List ttbb = new ArrayList(); + List ttcc = new ArrayList(); + List ttdd = new ArrayList(); + List ppaa = new ArrayList(); + List ppbb = new ArrayList(); + List ppcc = new ArrayList(); + List ppdd = new ArrayList(); + List trop_a = new ArrayList(); + List trop_c = new ArrayList(); + List wmax_a = new ArrayList(); + List wmax_c = new ArrayList(); + for (Calendar timeCal : rangeTimeCalLst) { + if (merge == 0) { + // ms.unMergedUairSounding + // *System.out.println ( " Request unmerged data"); + if (dataType.equals(DataType.ALLDATA.toString())) + pf = ObservedSoundingQuery + .getObservedSndBufruaAllData(lat, lon, + stnId, timeCal, sndQuery); + else + pf = ObservedSoundingQuery + .getObservedSndBufruaData(lat, lon, stnId, + timeCal, dataType, sndQuery); + + } else { + + // Get TTAA. If not existent, try ship data (UUAA). If + // level is not null or missing, + // the body of code will return a sounding list with MAN + // data or single level data. + // *System.out.println ( " Request merged data at lat="+ + // lat+" lon="+lon+ " refT="+ + // timeCal.getTime().toGMTString()); + + ttaa = ObservedSoundingQuery.getObservedSndBufruaData( + lat, lon, stnId, timeCal, "TTAA", sndQuery) + .getSoundingLyLst(); + ttbb = ObservedSoundingQuery.getObservedSndBufruaData( + lat, lon, stnId, timeCal, "TTBB", sndQuery) + .getSoundingLyLst(); + ttcc = ObservedSoundingQuery.getObservedSndBufruaData( + lat, lon, stnId, timeCal, "TTCC", sndQuery) + .getSoundingLyLst(); + ttdd = ObservedSoundingQuery.getObservedSndBufruaData( + lat, lon, stnId, timeCal, "TTDD", sndQuery) + .getSoundingLyLst(); + // ppaa = + // ObservedSoundingQuery.getObservedSndBufruaData(lat, + // lon, stnId, timeCal, "PPAA", + // sndQuery).getSoundingLyLst(); + ppbb = ObservedSoundingQuery.getObservedSndBufruaData( + lat, lon, stnId, timeCal, "PPBB", sndQuery) + .getSoundingLyLst(); + // ppcc = + // ObservedSoundingQuery.getObservedSndBufruaData(lat, + // lon, stnId, timeCal, "PPCC", + // sndQuery).getSoundingLyLst(); + ppdd = ObservedSoundingQuery.getObservedSndBufruaData( + lat, lon, stnId, timeCal, "PPDD", sndQuery) + .getSoundingLyLst(); + wmax_a = ObservedSoundingQuery + .getObservedSndBufruaData(lat, lon, stnId, + timeCal, "MAXWIND_A", sndQuery) + .getSoundingLyLst(); + wmax_c = ObservedSoundingQuery + .getObservedSndBufruaData(lat, lon, stnId, + timeCal, "MAXWIND_C", sndQuery) + .getSoundingLyLst(); + trop_a = ObservedSoundingQuery + .getObservedSndBufruaData(lat, lon, stnId, + timeCal, "TROPOPAUSE_A", sndQuery) + .getSoundingLyLst(); + trop_c = ObservedSoundingQuery + .getObservedSndBufruaData(lat, lon, stnId, + timeCal, "TROPOPAUSE_C", sndQuery) + .getSoundingLyLst(); + pf = ObservedSoundingQuery.getObservedSndStnInfo(lat, + lon, stnId, sndType, timeCal, sndQuery); + sls = ms.mergeUairSounding(level, ttaa, ttbb, ttcc, + ttdd, ppaa, ppbb, ppcc, ppdd, trop_a, trop_c, + wmax_a, wmax_c, pf.getStationElevation()); + + // System.out.println("BUFRUA Number of Layers after merge:"+sls.size() + // + " level="+level + + // " ms.isNumber(level)="+ms.isNumber(level)); + // for(NcSoundingLayer ly: sls){ + // System.out.println("Pre= "+ly.getPressure()+ + // " Dew= "+ ly.getDewpoint()+ " T= "+ + // ly.getTemperature()+" H="+ly.getGeoHeight()+" WSp="+ly.getWindSpeed()); + // } + + if (level.toUpperCase().equalsIgnoreCase("MAN")) + pf.setSoundingLyLst(sls); + else if (ms.isNumber(level) >= 0) { + if (sls.size() == 1) { + // System.out.println("NCUAIR get one layer using level = "+ + // level); + pf.setSoundingLyLst(sls); + } else { + pf = null; + // System.out.println("NCUAIR get 0 layer using level = "+ + // level); + } + } else { + if (sls.isEmpty() || sls.size() <= 1) + pf = null; + else + pf.setSoundingLyLst(sls); + } + + } + if (pf != null && pf.getSoundingLyLst().size() > 0) { + soundingProfileList.add(pf); + pf = null; + } + } + } + } + + if (soundingProfileList.size() == 0) + cube.setRtnStatus(failedRtnStatus); + else + cube.setRtnStatus(NcSoundingCube.QueryStatus.OK); + + cube.setSoundingProfileList(soundingProfileList); + returnedObject = cube; + + // long t02 = System.currentTimeMillis(); + // System.out.println("PFC/OBS cube retreival took " + (t02 - t01)); + return returnedObject; + } + + /* + * Chin:: 2/21/2012 Only NCUair and PFC (modelsounding DB) query is + * supported now Use generic query API Mainly used by CAVE Resource plotting + * Returned Sounding data are stored in NcSoundingLayer2. + */ + public Object getSoundingData2Generic() throws Exception { + long t01 = System.currentTimeMillis(); + Object returnedObject = new Object(); + // *System.out.println ( " getSoundingDataByLatLonArray "); + if (stnIdArr.length <= 0) { + returnedObject = null; + return returnedObject; + } + // List timeLineStrList=new ArrayList();; + // List timeLimeCalList = new ArrayList(); + + NcSoundingCube cube = new NcSoundingCube(); + List soundingProfileList = new ArrayList( + 0); + NcSoundingCube.QueryStatus failedRtnStatus = NcSoundingCube.QueryStatus.FAILED; + + NcSoundingProfile pf; + MergeSounding2 ms = new MergeSounding2(); + if (sndType.equals(ObsSndType.NCUAIR.toString())) { + // Note: in NC Uair table, we only use ref time for query + if (rangeTimeStringLst != null && rangeTimeStringLst.size() == 0) { + // one single time line + rangeTimeStringLst.add(refTimeStr); + } + // for (int j=0; j< rangeTimeStringLst.size(); j++){ + // String timeStr = rangeTimeStringLst.get(j); + List uairRecordArrList; + long t003 = System.currentTimeMillis(); + uairRecordArrList = ObservedSoundingQuery + .getObservedSndNcUairDataGeneric(coordinateArray, stnIdArr, + rangeTimeStringLst, rangeTimeArr); + long t004 = System.currentTimeMillis(); + System.out.println("getObservedSndNcUairDataGeneric query took " + + (t004 - t003) + "ms"); + if (uairRecordArrList != null && uairRecordArrList.size() > 0) { + long t005 = System.currentTimeMillis(); + // for each station, processing its records list and keep in one + // profile + for (NcUairRecord[] recordArray : uairRecordArrList) { + + // System.out.println("getSoundingDataByLatLonArray:NcUair: lat="+lat+ + // " lon="+lon); + // make sure we have right precision... + + if (merge == 0) { + // Chin...need more coding + pf = null; + } else { + pf = new NcSoundingProfile(); + /* + * Chin: If caller need all query stns returned (no + * matter there is no data), then we may need to add + * this code... if(recordArray != null && + * recordArray.length == 1){ //could be a special case + * that the record is just used to return this stn's + * lat/lon back if(recordArray[0].getNil() == true){ + * pf.setStationLatitude + * ((float)recordArray[0].getLatitude()); + * pf.setStationLongitude + * ((float)recordArray[0].getLongitude()); + * soundingProfileList.add(pf); continue; // skip this + * stn as there are no real data retrieved } } + */ + if (recordArray != null && recordArray.length > 0) { + List sls = new ArrayList(); + List ttaa = new ArrayList(); + List ttbb = new ArrayList(); + List ttcc = new ArrayList(); + List ttdd = new ArrayList(); + List ppaa = new ArrayList(); + List ppbb = new ArrayList(); + List ppcc = new ArrayList(); + List ppdd = new ArrayList(); + List trop_a = new ArrayList(); + List trop_c = new ArrayList(); + List wmax_a = new ArrayList(); + List wmax_c = new ArrayList(); + + for (int k = 0; k < recordArray.length; k++) { + NcUairRecord record = recordArray[k]; + if (record.getDataType().equals("TTAA") + || record.getDataType().equals("XXAA")) { + ttaa = getSoundingLayer2FromNcUairRecordObsLevel(record); + trop_a = getSoundingLayer2FromNcUairRecordTrop(record); + wmax_a = getSoundingLayer2FromNcUairRecordMaxw(record); + } else if (record.getDataType().equals("TTBB") + || record.getDataType().equals("XXBB")) { + ttbb = getSoundingLayer2FromNcUairRecordObsLevel(record); + } else if (record.getDataType().equals("TTCC") + || record.getDataType().equals("XXCC")) { + ttcc = getSoundingLayer2FromNcUairRecordObsLevel(record); + trop_c = getSoundingLayer2FromNcUairRecordTrop(record); + wmax_c = getSoundingLayer2FromNcUairRecordMaxw(record); + } else if (record.getDataType().equals("TTDD") + || record.getDataType().equals("XXDD")) { + ttdd = getSoundingLayer2FromNcUairRecordObsLevel(record); + } else if (record.getDataType().equals("PPAA")) { + ppaa = getSoundingLayer2FromNcUairRecordObsLevel(record); + } else if (record.getDataType().equals("PPBB")) { + ppbb = getSoundingLayer2FromNcUairRecordObsLevel(record); + } else if (record.getDataType().equals("PPCC")) { + ppcc = getSoundingLayer2FromNcUairRecordObsLevel(record); + } else if (record.getDataType().equals("PPDD")) { + ppdd = getSoundingLayer2FromNcUairRecordObsLevel(record); + } + } + pf.setStationElevation((float) recordArray[0] + .getElevation()); + pf.setStationId(recordArray[0].getStationId()); + if (recordArray[0].getStnum() != null + && recordArray[0].getStnum().length() > 0) + pf.setStationNum(Integer + .parseInt(recordArray[0].getStnum())); + pf.setStationLatitude(recordArray[0].getLatitude()); + pf.setStationLongitude(recordArray[0] + .getLongitude()); + // System.out.println(" input lat="+lat+" pf's lat="+pf.getStationLatitude()+" elv="+pf.getStationElevation()+" stnId="+pf.getStationId()); + sls = ms.mergeUairSounding(level, ttaa, ttbb, ttcc, + ttdd, ppaa, ppbb, ppcc, ppdd, trop_a, + trop_c, wmax_a, wmax_c, + pf.getStationElevation()); + + if (level.toUpperCase().equalsIgnoreCase("MAN")) { + pf.setSoundingLyLst2(sls); + // System.out.println("sls set to the sounding profile"); + } else if (ms.isNumber(level) >= 0) { + if (sls.size() == 1) { + // System.out.println("NcUair get one layer using level = "+ + // level); + pf.setSoundingLyLst2(sls); + } else { + pf = null; + // System.out.println("NcUair get 0 layer using level = "+ + // level); + } + } else { + if (sls.isEmpty() || sls.size() <= 1) { + pf = null; + // System.out.println("not MAN level & sls is empty or 1"); + } else { + pf.setSoundingLyLst2(sls); + // System.out.println("sls set to the sounding profile for level = " + // + level); + } + } + } + } + if (pf != null && pf.getSoundingLyLst2().size() > 0) { + // System.out.println(" pf is not null, so adding a profile to the list of NcSoundingProfiles "); + soundingProfileList.add(pf); + pf = null; + } + + } + long t006 = System.currentTimeMillis(); + System.out + .println("getSoundingData2Generic total sounding time merging for " + + uairRecordArrList.size() + + " profiles took " + + (t006 - t005) + "ms"); + } + // } + } else if (sndType.equals(PfcSndType.NAMSND.toString()) + || sndType.equals(PfcSndType.GFSSND.toString()) + || sndType.equals(PfcSndType.RUCPTYPSND.toString()) + || sndType.equals(PfcSndType.RUC2SND.toString())) { + + List listReturned = PfcSoundingQuery + .getPfcSndDataGeneric(null, stnIdArr, refTimeStr, + rangeTimeStringLst, sndType, level); + soundingProfileList.addAll(listReturned); + convertPfcNcSoundingLayerToNcSoundingLayer2(soundingProfileList); + // sysPrintProfileLayer2(soundingProfileList); + + } + /* + * else if(sndType.equals(MdlSndType.ANY.toString()) ) { + * + * pf = MdlSoundingQuery.getMdlSndData( lat, lon, refTimeStr, + * validTimeStartStr, pluginName, modelName ); if(pf.getRtnStatus() != + * NcSoundingCube.QueryStatus.OK){ failedRtnStatus = pf.getRtnStatus(); + * pf = null; } } + */ + /* + * else if(sndType.equals(ObsSndType.BUFRUA.toString())){ + * List sls = new ArrayList(); + * List ttaa = new ArrayList(); + * List ttbb = new ArrayList(); + * List ttcc = new ArrayList(); + * List ttdd = new ArrayList(); + * List ppaa = new ArrayList(); + * List ppbb = new ArrayList(); + * List ppcc = new ArrayList(); + * List ppdd = new ArrayList(); + * List trop_a = new ArrayList(); + * List trop_c = new ArrayList(); + * List wmax_a = new ArrayList(); + * List wmax_c = new ArrayList(); if + * ( merge == 0 ) { // ms.unMergedUairSounding //*System.out.println ( + * " Request unmerged data"); + * if(dataType.equals(DataType.ALLDATA.toString())) pf = + * ObservedSoundingQuery.getObservedSndBufruaAllData(lat, lon,"", + * refTimeCal, sndQuery); else pf = + * ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", + * refTimeCal, dataType, sndQuery); + * + * } else { + * + * // Get TTAA. If not existent, try ship data (UUAA). If level is not + * null or missing, // the body of code will return a sounding list with + * MAN data or single level data. //*System.out.println ( + * " Request merged data at lat="+ lat+" lon="+lon+ " refT="+ + * refTimeCal.getTime().toGMTString()); + * + * pf = ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", + * refTimeCal,"TTAA", sndQuery); ttaa = pf.getSoundingLyLst2(); ttbb = + * ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", + * refTimeCal, "TTBB", sndQuery).getSoundingLyLst2(); ttcc = + * ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", + * refTimeCal, "TTCC", sndQuery).getSoundingLyLst2(); ttdd = + * ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", + * refTimeCal, "TTDD", sndQuery).getSoundingLyLst2(); //ppaa = + * ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", + * refTimeCal, "PPAA", sndQuery).getSoundingLyLst2(); ppbb = + * ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", + * refTimeCal, "PPBB", sndQuery).getSoundingLyLst2(); //ppcc = + * ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", + * refTimeCal, "PPCC", sndQuery).getSoundingLyLst2(); ppdd = + * ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", + * refTimeCal, "PPDD", sndQuery).getSoundingLyLst2(); wmax_a = + * ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", + * refTimeCal, "MAXWIND_A", sndQuery).getSoundingLyLst2(); wmax_c = + * ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", + * refTimeCal, "MAXWIND_C", sndQuery).getSoundingLyLst2(); trop_a = + * ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", + * refTimeCal, "TROPOPAUSE_A", sndQuery).getSoundingLyLst2(); trop_c = + * ObservedSoundingQuery.getObservedSndBufruaData(lat, lon, "", + * refTimeCal, "TROPOPAUSE_C", sndQuery).getSoundingLyLst2(); pf = + * ObservedSoundingQuery.getObservedSndStnInfo(lat, lon,"",sndType, + * refTimeCal,sndQuery); sls = + * ms.mergeUairSounding(level,ttaa,ttbb,ttcc, + * ttdd,ppaa,ppbb,ppcc,ppdd,trop_a + * ,trop_c,wmax_a,wmax_c,pf.getStationElevation()); + * + * //System.out.println("BUFRUA Number of Layers after merge:"+sls.size() + * + " level="+level + " ms.isNumber(level)="+ms.isNumber(level)); + * //for(NcSoundingLayer ly: sls){ // + * System.out.println("Pre= "+ly.getPressure()+ " Dew= "+ + * ly.getDewpoint()+ " T= "+ + * ly.getTemperature()+" H="+ly.getGeoHeight()+ + * " WSp="+ly.getWindSpeed()); //} + * + * if (level.toUpperCase().equalsIgnoreCase("MAN") ) + * pf.setSoundingLyLst2(sls); else if( ms.isNumber(level)>=0 ){ + * if(sls.size() == 1){ + * //System.out.println("NcUair get one layer using level = "+ level); + * pf.setSoundingLyLst2(sls); } else { pf = null; + * //System.out.println("NcUair get 0 layer using level = "+ level); } } + * else { if(sls.isEmpty() || sls.size() <=1) pf = null; else + * pf.setSoundingLyLst2(sls); } + * + * } + * + * if(pf != null && pf.getSoundingLyLst2().size()>0) { + * //System.out.println( + * " pf is not null, so adding a profile to the list of NcSoundingProfiles " + * ); + * + * // TODO : move this into the ObservedSoundingQuery methods. // + * pf.setStationLatitude( lat ); pf.setStationLongitude( lon ); + * + * + * soundingProfileList.add(pf); + * //pf.setStationLatitude(lat.floatValue()); + * //pf.setStationLongitude(lon.floatValue()); pf = null; } } + */ + if (soundingProfileList.size() == 0) { + // System.out.println(" Return status from NcSoundingDrv.getSoundingLayer2DataUsingLatLonArray() is set to failed "); + cube.setRtnStatus(failedRtnStatus); + + } else { + // System.out.println(); + cube.setRtnStatus(NcSoundingCube.QueryStatus.OK); + // long t02 = System.currentTimeMillis(); + // System.out.println("Return status from NcSoundingDrv.getSoundingLayer2DataUsingLatLonArray() - success, cube retreival took " + // + (t02 - t01)); + } + cube.setSoundingProfileList(soundingProfileList); + /* + * for(int i =0; i < cube.getSoundingProfileList().size();i++){ + * System.out.println("lat/lon="+ + * cube.getSoundingProfileList().get(i).getStationLatitude + * ()+"/"+cube.getSoundingProfileList().get(i).getStationLongitude()+ + * " temp=" + * +cube.getSoundingProfileList().get(i).getSoundingLyLst2().get( + * 0).getTemperature + * ()+" dewp="+cube.getSoundingProfileList().get(i).getSoundingLyLst2 + * ().get(0).getDewpoint()+" press="+ + * cube.getSoundingProfileList().get(i + * ).getSoundingLyLst2().get(0).getPressure() + + * " height="+cube.getSoundingProfileList + * ().get(i).getSoundingLyLst2().get(0).getGeoHeight()+ + * " windSp="+cube.getSoundingProfileList + * ().get(i).getSoundingLyLst2().get + * (0).getWindSpeed()+" windDir="+cube.getSoundingProfileList + * ().get(i).getSoundingLyLst2().get(0).getWindDirection()+ + * " omega="+cube + * .getSoundingProfileList().get(i).getSoundingLyLst2().get + * (0).getOmega()); } + */ + returnedObject = cube; + // long t02 = System.currentTimeMillis(); + // System.out.println("getSoundingData2Generic query took "+(t02-t01)+" ms in total"); + + return returnedObject; + } + + /* + * Chin:: 2/22/2012 Only NCUair and PFC (modelsounding DB) query is + * supported now Use generic query API + */ + public Object getSoundingDataGeneric() throws Exception { + long t01 = System.currentTimeMillis(); + Object returnedObject = new Object(); + // *System.out.println ( " getSoundingDataByLatLonArray "); + + NcSoundingCube cube = new NcSoundingCube(); + List soundingProfileList = new ArrayList( + 0); + NcSoundingCube.QueryStatus failedRtnStatus = NcSoundingCube.QueryStatus.FAILED; + + if (sndType.equals(ObsSndType.NCUAIR.toString())) { + // Note: in NC Uair table, we only use ref time for query + if (rangeTimeStringLst != null && rangeTimeStringLst.size() == 0) { + // one single time line + rangeTimeStringLst.add(refTimeStr); + } + + List uairRecordArrList; + // long t003 = System.currentTimeMillis(); + uairRecordArrList = ObservedSoundingQuery + .getObservedSndNcUairDataGeneric(coordinateArray, stnIdArr, + rangeTimeStringLst, rangeTimeArr); + // long t004 = System.currentTimeMillis(); + // System.out.println("getObservedSndNcUairDataGeneric API call took "+(t004-t003)+"ms"); + if (uairRecordArrList != null && uairRecordArrList.size() > 0) { + // long t005 = System.currentTimeMillis(); + soundingProfileList = processQueryReturnedNcUairData( + uairRecordArrList, useNcSoundingLayer2); + // long t006 = System.currentTimeMillis(); + // System.out.println("getSoundingDataGeneric total sounding time merging for "+uairRecordArrList.size()+" profiles took "+(t006-t005)+"ms"); + } + + } else if (sndType.equals(PfcSndType.NAMSND.toString()) + || sndType.equals(PfcSndType.GFSSND.toString()) + || sndType.equals(PfcSndType.RUCPTYPSND.toString()) + || sndType.equals(PfcSndType.RUC2SND.toString())) { + + List listReturned = PfcSoundingQuery + .getPfcSndDataGeneric(coordinateArray, stnIdArr, + refTimeStr, rangeTimeStringLst, sndType, level); + soundingProfileList.addAll(listReturned); + if (useNcSoundingLayer2 == true) { + convertPfcNcSoundingLayerToNcSoundingLayer2(soundingProfileList); + // sysPrintProfileLayer2(soundingProfileList); + } + + } else if (sndType.equals(MdlSndType.ANY.toString())) { + return getSoundingDataByLatLonArray(); + } else if (sndType.equals(ObsSndType.BUFRUA.toString())) { + return getSoundingDataByLatLonArray(); + } + if (soundingProfileList.size() == 0) { + // System.out.println(" Return status from NcSoundingDrv.getSoundingLayer2DataUsingLatLonArray() is set to failed "); + cube.setRtnStatus(failedRtnStatus); + + } else { + // System.out.println(); + cube.setRtnStatus(NcSoundingCube.QueryStatus.OK); + // long t02 = System.currentTimeMillis(); + // System.out.println("Return status from NcSoundingDrv.getSoundingLayer2DataUsingLatLonArray() - success, cube retreival took " + // + (t02 - t01)); + } + cube.setSoundingProfileList(soundingProfileList); + /* + * for(int i =0; i < cube.getSoundingProfileList().size();i++){ + * System.out.println("lat/lon="+ + * cube.getSoundingProfileList().get(i).getStationLatitude + * ()+"/"+cube.getSoundingProfileList().get(i).getStationLongitude()+ + * " temp=" + * +cube.getSoundingProfileList().get(i).getSoundingLyLst2().get( + * 0).getTemperature + * ()+" dewp="+cube.getSoundingProfileList().get(i).getSoundingLyLst2 + * ().get(0).getDewpoint()+" press="+ + * cube.getSoundingProfileList().get(i + * ).getSoundingLyLst2().get(0).getPressure() + + * " height="+cube.getSoundingProfileList + * ().get(i).getSoundingLyLst2().get(0).getGeoHeight()+ + * " windSp="+cube.getSoundingProfileList + * ().get(i).getSoundingLyLst2().get + * (0).getWindSpeed()+" windDir="+cube.getSoundingProfileList + * ().get(i).getSoundingLyLst2().get(0).getWindDirection()+ + * " omega="+cube + * .getSoundingProfileList().get(i).getSoundingLyLst2().get + * (0).getOmega()); } + */ + returnedObject = cube; + // long t02 = System.currentTimeMillis(); + // System.out.println("getSoundingDataGeneric API took "+(t02-t01)+" ms in total"); + + return returnedObject; + } + + /* + * This API is for getting multiple locations sounding info at one shot. + * StnIdArray or StnNumArray is used as input stn info for each location. + * + * Chin Note: 02/27/12 obsoleting this one. Use getSoundingDataGeneric() + * + * public Object getSoundingDataByStnArray() throws Exception { Object + * returnedObject = new Object(); //System.out.println ( + * " getSoundingData "); + * + * + * NcSoundingCube cube = new NcSoundingCube(); List + * soundingProfileList = new ArrayList(); SndQueryKeyType + * sndQuery; String[] stnArray; + * if(queryType.equals(SndQueryKeyType.STNID.toString())){ sndQuery = + * SndQueryKeyType.STNID; stnArray = stnIdArr.clone(); + * + * } else if(queryType.equals(SndQueryKeyType.STNNUM.toString())){ sndQuery + * = SndQueryKeyType.STNNUM; stnArray = stnNumArr.clone(); } else { + * returnedObject = null; return returnedObject; } if(stnArray.length <= 0){ + * returnedObject = null; return returnedObject; } List + * timeLineStrList=new ArrayList(); List timeLimeCalList = + * new ArrayList(); if(validTimeEnd !=0 && validTimeEnd > + * validTimeStart){ //range of time line request timeLimeCalList = + * ObservedSoundingQuery.getObservedSndTimeRangeList(sndType, + * validTimeStartCal, validTimeEndCal); for (int i=0; i< + * timeLimeCalList.size(); i++){ Calendar timeCal = timeLimeCalList.get(i); + * String timeStr = String.format("%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS", + * timeCal); timeLineStrList.add(timeStr); + * + * } } else { //one single time line timeLineStrList.add(new + * SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(refTimeCal.getTime())); + * timeLimeCalList.add(refTimeCal); } String stn; for ( int i=0; i < + * stnArray.length ; i++) { + * + * stn = stnArray[i]; stn.toUpperCase(Locale.ENGLISH); //System.out.println + * ( "Request getSoundingData at " + stn); MergeSounding ms = new + * MergeSounding(); for (int j=0; j< timeLineStrList.size(); j++){ String + * timeStr = timeLineStrList.get(j); Calendar timeCal = + * timeLimeCalList.get(j); + * + * List sls = new ArrayList(); + * List ttaa = new ArrayList(); + * List ttbb = new ArrayList(); + * List ttcc = new ArrayList(); + * List ttdd = new ArrayList(); + * List ppaa = new ArrayList(); + * List ppbb = new ArrayList(); + * List ppcc = new ArrayList(); + * List ppdd = new ArrayList(); + * List trop_a = new ArrayList(); + * List trop_c = new ArrayList(); + * List wmax_a = new ArrayList(); + * List wmax_c = new ArrayList(); + * + * NcSoundingProfile pf = null; if + * (sndType.equals(ObsSndType.NCUAIR.toString())){ + * //System.out.println("getSoundingDataByLatLonArray:NcUair: lat="+lat+ + * " lon="+lon); if ( merge == 0 ) { //Chin...need more coding pf = null; } + * else{ + * + * long t001 = System.currentTimeMillis(); //get TTAA & TROPOPAUSE_A & + * MAXWIND_A NcUairRecord record = + * ObservedSoundingQuery.getObservedSndNcUairData(lat, lon, "", timeStr, + * "TTAA", sndQuery); if(record != null){ ttaa = + * getSndLayersFromNcUairRecordObsLevel(record); trop_a = + * getSndLayersFromNcUairRecordTrop(record); wmax_a = + * getSndLayersFromNcUairRecordMaxw(record); } //get TTCC & TROPOPAUSE_C & + * MAXWIND_C record = ObservedSoundingQuery.getObservedSndNcUairData(0d, 0d, + * stn, timeStr, "TTCC", sndQuery); if(record != null){ ttcc = + * getSndLayersFromNcUairRecordObsLevel(record); trop_c = + * getSndLayersFromNcUairRecordTrop(record); wmax_c = + * getSndLayersFromNcUairRecordMaxw(record); } //get TTBB record = + * ObservedSoundingQuery.getObservedSndNcUairData(0d, 0d, stn, timeStr, + * "TTBB", sndQuery); if(record != null){ ttbb = + * getSndLayersFromNcUairRecordObsLevel(record); } //get TTDD record = + * ObservedSoundingQuery.getObservedSndNcUairData(0d, 0d, stn, timeStr, + * "TTDD", sndQuery); if(record != null){ ttdd = + * getSndLayersFromNcUairRecordObsLevel(record); } //get PPAA record = + * ObservedSoundingQuery.getObservedSndNcUairData(0d, 0d, stn, timeStr, + * "PPAA", sndQuery); if(record != null){ ppaa = + * getSndLayersFromNcUairRecordObsLevel(record); } //get PPBB record = + * ObservedSoundingQuery.getObservedSndNcUairData(0d, 0d, stn, timeStr, + * "PPBB", sndQuery); if(record != null){ ppbb = + * getSndLayersFromNcUairRecordObsLevel(record); } //get PPCC record = + * ObservedSoundingQuery.getObservedSndNcUairData(0d, 0d, stn, timeStr, + * "PPCC", sndQuery); if(record != null){ ppcc = + * getSndLayersFromNcUairRecordObsLevel(record); } //get PPDD record = + * ObservedSoundingQuery.getObservedSndNcUairData(0d, 0d, stn, timeStr, + * "PPDD", sndQuery); if(record != null){ ppdd = + * getSndLayersFromNcUairRecordObsLevel(record); } pf = + * ObservedSoundingQuery.getObservedSndStnInfo(0d, 0d, stn,sndType, + * refTimeCal,sndQuery); long t02 = System.currentTimeMillis(); + * System.out.println("NcUair (by stn) profile retreival took " + (t02 - + * t001)); sls = + * ms.mergeUairSounding(level,ttaa,ttbb,ttcc,ttdd,ppaa,ppbb,ppcc + * ,ppdd,trop_a,trop_c,wmax_a,wmax_c,pf.getStationElevation()); + * //System.out.println("NcUair Number of Layers:"+sls.size()); + * //for(NcSoundingLayer ly: sls){ // + * System.out.println("Pre= "+ly.getPressure()+ " Dew= "+ ly.getDewpoint()+ + * " T= "+ + * ly.getTemperature()+" H="+ly.getGeoHeight()+" WSp="+ly.getWindSpeed()); + * //} + * + * pf.setSoundingLyLst(sls); } } else if + * (//sndType.equals(ObsSndType.UAIR.toString()) || + * sndType.equals(ObsSndType.DROP.toString()) || + * sndType.equals(ObsSndType.TAMDAR.toString())) { + * + * if ( merge == 0 ) { // ms.unMergedUairSounding //System.out.println ( + * " Request unmerged data"); + * if(dataType.equals(DataType.ALLDATA.toString())) pf = + * ObservedSoundingQuery.getObservedSndAllData(0d, 0d, stn, timeCal, + * sndType, sndQuery); else pf = + * ObservedSoundingQuery.getObservedSndData(0d, 0d, stn, timeCal, sndType, + * dataType, sndQuery); + * + * + * } else { + * + * // Get TTAA. If not existent, try ship data (UUAA). If level is not null + * or missing, // the body of code will return a sounding list with MAN data + * or single level data. //*System.out.println ( + * " Request merged data at lat="+ lat+" lon="+lon+ " refT="+ + * refTimeCal.getTime().toGMTString()); + * + * // TO DO -----> add station ID and station number and a list of stations + * queries. pf = ObservedSoundingQuery.getObservedSndData(0d, 0d, stn, + * timeCal, sndType, "TTAA", sndQuery); ttaa = pf.getSoundingLyLst(); if + * (ttaa.size() == 0) { ttaa = ObservedSoundingQuery.getObservedSndData(0d, + * 0d, stn, timeCal, sndType, "UUAA", sndQuery).getSoundingLyLst(); } + * + * ttbb = ObservedSoundingQuery.getObservedSndData(0d, 0d, stn, timeCal, + * sndType, "TTBB", sndQuery).getSoundingLyLst(); if (ttbb.size() == 0) { + * ttbb = ObservedSoundingQuery.getObservedSndData(0d, 0d, stn, timeCal, + * sndType, "UUBB", sndQuery).getSoundingLyLst(); } + * + * ttcc = ObservedSoundingQuery.getObservedSndData(0d, 0d, stn, timeCal, + * sndType, "TTCC", sndQuery).getSoundingLyLst(); if (ttcc.size() == 0) { + * ttcc = ObservedSoundingQuery.getObservedSndData(0d, 0d, stn, timeCal, + * sndType, "UUCC", sndQuery).getSoundingLyLst(); } + * + * ttdd = ObservedSoundingQuery.getObservedSndData(0d, 0d, stn, timeCal, + * sndType, "TTDD", sndQuery).getSoundingLyLst(); if (ttdd.size() == 0) { + * ttdd = ObservedSoundingQuery.getObservedSndData(0d, 0d, stn, timeCal, + * sndType, "UUDD", sndQuery).getSoundingLyLst(); } + * + * ppaa = ObservedSoundingQuery.getObservedSndData(0d, 0d, stn, timeCal, + * sndType, "PPAA", sndQuery).getSoundingLyLst(); ppbb = + * ObservedSoundingQuery.getObservedSndData(0d, 0d, stn, timeCal, sndType, + * "PPBB", sndQuery).getSoundingLyLst(); ppcc = + * ObservedSoundingQuery.getObservedSndData(0d, 0d, stn, timeCal, sndType, + * "PPCC", sndQuery).getSoundingLyLst(); ppdd = + * ObservedSoundingQuery.getObservedSndData(0d, 0d, stn, timeCal, sndType, + * "PPDD", sndQuery).getSoundingLyLst(); wmax_a = + * ObservedSoundingQuery.getObservedSndData(0d, 0d, stn, timeCal, sndType, + * "MAXWIND_A", sndQuery).getSoundingLyLst(); wmax_c = + * ObservedSoundingQuery.getObservedSndData(0d, 0d, stn, timeCal, sndType, + * "MAXWIND_C", sndQuery).getSoundingLyLst(); trop_a = + * ObservedSoundingQuery.getObservedSndData(0d, 0d, stn, timeCal, sndType, + * "TROPOPAUSE_A", sndQuery).getSoundingLyLst(); trop_c = + * ObservedSoundingQuery.getObservedSndData(0d, 0d, stn, timeCal, sndType, + * "TROPOPAUSE_C", sndQuery).getSoundingLyLst(); pf = + * ObservedSoundingQuery.getObservedSndStnInfo(0d, 0d,stn,sndType, + * timeCal,sndQuery); sls = + * ms.mergeUairSounding(level,ttaa,ttbb,ttcc,ttdd,ppaa + * ,ppbb,ppcc,ppdd,trop_a,trop_c,wmax_a,wmax_c,pf.getStationElevation()); + * pf.setSoundingLyLst(sls); } + * + * } else if(sndType.equals(ObsSndType.BUFRUA.toString())){ if ( merge == 0 + * ) { // ms.unMergedUairSounding //*System.out.println ( + * " Request unmerged data"); + * if(dataType.equals(DataType.ALLDATA.toString())) pf = + * ObservedSoundingQuery.getObservedSndBufruaAllData(0d, 0d, stn, + * refTimeCal, sndQuery); else pf = + * ObservedSoundingQuery.getObservedSndBufruaData(0d, 0d, stn, refTimeCal, + * dataType, sndQuery); + * + * } else { + * + * // Get TTAA. If not existent, try ship data (UUAA). If level is not null + * or missing, // the b0dy of c0de will return a sounding list with MAN data + * or single level data. //*System.out.println ( + * " Request merged data at lat="+ lat+" lon="+lon+ " refT="+ + * refTimeCal.getTime().toGMTString()); + * + * pf = ObservedSoundingQuery.getObservedSndBufruaData(0d, 0d, stn, + * refTimeCal,"TTAA", sndQuery); ttaa = pf.getSoundingLyLst(); ttbb = + * ObservedSoundingQuery.getObservedSndBufruaData(0d, 0d, stn, refTimeCal, + * "TTBB", sndQuery).getSoundingLyLst(); ttcc = + * ObservedSoundingQuery.getObservedSndBufruaData(0d, 0d, stn, refTimeCal, + * "TTCC", sndQuery).getSoundingLyLst(); ttdd = + * ObservedSoundingQuery.getObservedSndBufruaData(0d, 0d, stn, refTimeCal, + * "TTDD", sndQuery).getSoundingLyLst(); //ppaa = + * ObservedSoundingQuery.getObservedSndBufruaData(0d, 0d, stn, refTimeCal, + * "PPAA", sndQuery).getSoundingLyLst(); ppbb = + * ObservedSoundingQuery.getObservedSndBufruaData(0d, 0d, stn, refTimeCal, + * "PPBB", sndQuery).getSoundingLyLst(); //ppcc = + * ObservedSoundingQuery.getObservedSndBufruaData(0d, 0d, stn, refTimeCal, + * "PPCC", sndQuery).getSoundingLyLst(); ppdd = + * ObservedSoundingQuery.getObservedSndBufruaData(0d, 0d, stn, refTimeCal, + * "PPDD", sndQuery).getSoundingLyLst(); wmax_a = + * ObservedSoundingQuery.getObservedSndBufruaData(0d, 0d, stn, refTimeCal, + * "MAXWIND_A", sndQuery).getSoundingLyLst(); wmax_c = + * ObservedSoundingQuery.getObservedSndBufruaData(0d, 0d, stn, refTimeCal, + * "MAXWIND_C", sndQuery).getSoundingLyLst(); trop_a = + * ObservedSoundingQuery.getObservedSndBufruaData(0d, 0d, stn, refTimeCal, + * "TROPOPAUSE_A", sndQuery).getSoundingLyLst(); trop_c = + * ObservedSoundingQuery.getObservedSndBufruaData(0d, 0d, stn, refTimeCal, + * "TROPOPAUSE_C", sndQuery).getSoundingLyLst(); pf = + * ObservedSoundingQuery.getObservedSndStnInfo(0d, 0d,stn,sndType, + * refTimeCal,sndQuery); sls = + * ms.mergeUairSounding(level,ttaa,ttbb,ttcc,ttdd + * ,ppaa,ppbb,ppcc,ppdd,trop_a, + * trop_c,wmax_a,wmax_c,pf.getStationElevation()); pf.setSoundingLyLst(sls); + * } } else if(sndType.equals(PfcSndType.NAMSND.toString()) || + * sndType.equals(PfcSndType.GFSSND.toString()) || + * sndType.equals(PfcSndType.RUCPTYPSND.toString()) || + * sndType.equals(PfcSndType.RUC2SND.toString())) { //*System.out.println ( + * " Processing native model data"); pf = + * PfcSoundingQuery.getPfcSndData(0d,0d, stn, refTimeCal, validTimeStartCal, + * sndType,sndQuery); ms.nativeModelSounding(pf.getSoundingLyLst(), + * pf.getStationElevation()); if ( ms.isNumber (level) == 0 ) { //level is + * an integer >=0. It means user request a single level float rlev = new + * Integer(Integer.parseInt(level.trim())).floatValue(); + * pf.setSoundingLyLst(ms.getSingLevel(rlev, pf.getSoundingLyLst())); } else + * if ( ms.isNumber (level) == 1 ) { //level is an float >=0. It also means + * user request a single level float rlev = new + * Float(Float.parseFloat(level.trim())); + * pf.setSoundingLyLst(ms.getSingLevel(rlev, pf.getSoundingLyLst())); } + * + * } else if(sndType.equals(MdlSndType.ANY.toString())) { //model sounding + * query by stn is not supported yet pf = null; } else { pf = null; } if(pf + * != null && pf.getSoundingLyLst().size()>0) { soundingProfileList.add(pf); + * pf.setStationId(stn); + * + * pf = null; } } } if(soundingProfileList.size() == 0 ) + * cube.setRtnStatus(NcSoundingCube.QueryStatus.FAILED); else + * cube.setRtnStatus(NcSoundingCube.QueryStatus.OK); + * + * cube.setSoundingProfileList(soundingProfileList); returnedObject = cube; + * + * + * return returnedObject; } + */ + public Object getModels() throws Exception { + Object returnedObject = new Object(); + NcSoundingModel mdls = MdlSoundingQuery.getMdls(pluginName); + returnedObject = mdls; + return returnedObject; + } + + /* + * Chin: this is not completed yet.... When use point data query for bufrua + * is supported, then we have to work on this one. + */ + private List processQueryReturnedBufruaData( + List uairRecordArrList, boolean useNcSndLayer2) { + List soundingProfileList = new ArrayList( + 0); + /* + * if ( merge == 0 ) { return soundingProfileList; + * + * } else { for(UAObs[] recordArray:uairRecordArrList){ + * + * NcSoundingProfile pf; + * + * pf = new NcSoundingProfile(); if(useNcSndLayer2== true){ //need more + * code } else { if(recordArray != null && recordArray.length >0){ + * MergeSounding ms = new MergeSounding(); List sls = + * new ArrayList(); List ttaa = new + * ArrayList(); List ttbb = new + * ArrayList(); List ttcc = new + * ArrayList(); List ttdd = new + * ArrayList(); List ppaa = new + * ArrayList(); List ppbb = new + * ArrayList(); List ppcc = new + * ArrayList(); List ppdd = new + * ArrayList(); List trop_a = new + * ArrayList(); List trop_c = new + * ArrayList(); List wmax_a = new + * ArrayList(); List wmax_c = new + * ArrayList(); + * + * for(int k=0; k< recordArray.length; k++){ UAObs record= + * recordArray[k]; if(record.getReportType() == + * NcSoundingLayer.dataTypeMap.get("TTAA")){ ttaa = + * getSndLayersFromNcUairRecordObsLevel(record); trop_a = + * getSndLayersFromNcUairRecordTrop(record); wmax_a = + * getSndLayersFromNcUairRecordMaxw(record); } else + * if(record.getDataType().equals("TTBB")){ ttbb = + * getSndLayersFromNcUairRecordObsLevel(record); } else + * if(record.getDataType().equals("TTCC")){ ttcc = + * getSndLayersFromNcUairRecordObsLevel(record); trop_c = + * getSndLayersFromNcUairRecordTrop(record); wmax_c = + * getSndLayersFromNcUairRecordMaxw(record); } else + * if(record.getDataType().equals("TTDD")){ ttdd = + * getSndLayersFromNcUairRecordObsLevel(record); } else + * if(record.getDataType().equals("PPAA")){ ppaa= + * getSndLayersFromNcUairRecordObsLevel(record); } else + * if(record.getDataType().equals("PPBB")){ ppbb = + * getSndLayersFromNcUairRecordObsLevel(record); } else + * if(record.getDataType().equals("PPCC")){ ppcc = + * getSndLayersFromNcUairRecordObsLevel(record); } else + * if(record.getDataType().equals("PPDD")){ ppdd = + * getSndLayersFromNcUairRecordObsLevel(record); } } pf = new + * NcSoundingProfile(); + * pf.setStationElevation((float)recordArray[0].getElevation()); + * pf.setStationId(recordArray[0].getStationId()); + * if(recordArray[0].getStnum() != null && + * recordArray[0].getStnum().length()>0) + * pf.setStationNum(Integer.parseInt(recordArray[0].getStnum())); + * pf.setStationLatitude(recordArray[0].getLatitude()); + * pf.setStationLongitude(recordArray[0].getLongitude()); + * pf.setFcsTime(recordArray[0].getDataTime().getRefTime().getTime()); + * // + * System.out.println(" input lat="+lat+" pf's lat="+pf.getStationLatitude + * ()+" elv="+pf.getStationElevation()+" stnId="+pf.getStationId()); sls + * = + * ms.mergeUairSounding(level,ttaa,ttbb,ttcc,ttdd,ppaa,ppbb,ppcc,ppdd,trop_a + * ,trop_c,wmax_a,wmax_c,pf.getStationElevation()); if + * (level.toUpperCase().equalsIgnoreCase("MAN") ) + * pf.setSoundingLyLst(sls); else if( ms.isNumber(level)>=0 ){ + * if(sls.size() == 1){ + * //System.out.println("NCUAIR get one layer using level = "+ level); + * pf.setSoundingLyLst(sls); } else { pf = null; + * //System.out.println("NCUAIR get 0 layer using level = "+ level); } } + * else { if(sls.isEmpty() || sls.size() <=1) pf = null; else + * pf.setSoundingLyLst(sls); } } else pf = null; } if(pf != null && + * (pf.getSoundingLyLst2().size()>0||pf.getSoundingLyLst().size()>0 )) { + * //System.out.println( + * " pf is not null, so adding a profile to the list of NcSoundingProfiles " + * ); soundingProfileList.add(pf); pf = null; } } } + */ + return soundingProfileList; + } + + private List processQueryReturnedNcUairData( + List uairRecordArrList, boolean useNcSndLayer2) { + List soundingProfileList = new ArrayList( + 0); + for (NcUairRecord[] recordArray : uairRecordArrList) { + + NcSoundingProfile pf; + + if (merge == 0) { + // Chin...need more coding + pf = null; + } else { + pf = new NcSoundingProfile(); + if (useNcSndLayer2 == true) { + // use NcSoundingLayer2 + if (recordArray != null && recordArray.length > 0) { + MergeSounding2 ms2 = new MergeSounding2(); + List sls = new ArrayList(); + List ttaa = new ArrayList(); + List ttbb = new ArrayList(); + List ttcc = new ArrayList(); + List ttdd = new ArrayList(); + List ppaa = new ArrayList(); + List ppbb = new ArrayList(); + List ppcc = new ArrayList(); + List ppdd = new ArrayList(); + List trop_a = new ArrayList(); + List trop_c = new ArrayList(); + List wmax_a = new ArrayList(); + List wmax_c = new ArrayList(); + + for (int k = 0; k < recordArray.length; k++) { + NcUairRecord record = recordArray[k]; + if (record.getDataType().equals("TTAA") + || record.getDataType().equals("XXAA")) { + ttaa = getSoundingLayer2FromNcUairRecordObsLevel(record); + trop_a = getSoundingLayer2FromNcUairRecordTrop(record); + wmax_a = getSoundingLayer2FromNcUairRecordMaxw(record); + } else if (record.getDataType().equals("TTBB") + || record.getDataType().equals("XXBB")) { + ttbb = getSoundingLayer2FromNcUairRecordObsLevel(record); + } else if (record.getDataType().equals("TTCC") + || record.getDataType().equals("XXCC")) { + ttcc = getSoundingLayer2FromNcUairRecordObsLevel(record); + trop_c = getSoundingLayer2FromNcUairRecordTrop(record); + wmax_c = getSoundingLayer2FromNcUairRecordMaxw(record); + } else if (record.getDataType().equals("TTDD") + || record.getDataType().equals("XXDD")) { + ttdd = getSoundingLayer2FromNcUairRecordObsLevel(record); + } else if (record.getDataType().equals("PPAA")) { + ppaa = getSoundingLayer2FromNcUairRecordObsLevel(record); + } else if (record.getDataType().equals("PPBB")) { + ppbb = getSoundingLayer2FromNcUairRecordObsLevel(record); + } else if (record.getDataType().equals("PPCC")) { + ppcc = getSoundingLayer2FromNcUairRecordObsLevel(record); + } else if (record.getDataType().equals("PPDD")) { + ppdd = getSoundingLayer2FromNcUairRecordObsLevel(record); + } + } + pf.setStationElevation((float) recordArray[0] + .getElevation()); + pf.setStationId(recordArray[0].getStationId()); + if (recordArray[0].getStnum() != null + && recordArray[0].getStnum().length() > 0) + pf.setStationNum(Integer.parseInt(recordArray[0] + .getStnum())); + pf.setStationLatitude(recordArray[0].getLatitude()); + pf.setStationLongitude(recordArray[0].getLongitude()); + pf.setFcsTime(recordArray[0].getDataTime().getRefTime() + .getTime()); + // System.out.println("m2 input lat=" + lat + + // " pf's lat=" + // + pf.getStationLatitude() + " elv=" + // + pf.getStationElevation() + " stnId=" + // + pf.getStationId()); + if (useNcSndLayer2) + sls = ms2.mergeUairSounding(level, ttaa, ttbb, + ttcc, ttdd, ppaa, ppbb, ppcc, ppdd, trop_a, + trop_c, wmax_a, wmax_c, + pf.getStationElevation()); + + if (level.toUpperCase().equalsIgnoreCase("MAN")) { + pf.setSoundingLyLst2(sls); + // System.out.println("sls set to the sounding profile"); + } else if (ms2.isNumber(level) >= 0) { + if (sls.size() == 1) { + // System.out.println("NcUair get one layer using level = "+ + // level); + pf.setSoundingLyLst2(sls); + } else { + pf = null; + // System.out.println("NcUair get 0 layer using level = "+ + // level); + } + } else { + if (sls.isEmpty() || sls.size() <= 1) { + pf = null; + // System.out.println("not MAN level & sls is empty or 1"); + } else { + pf.setSoundingLyLst2(sls); + // System.out.println("sls set to the sounding profile for level = " + // + level); + } + } + } + } else { + // use NcSoundingLayer + if (recordArray != null && recordArray.length > 0) { + MergeSounding ms = new MergeSounding(); + List sls = new ArrayList(); + List ttaa = new ArrayList(); + List ttbb = new ArrayList(); + List ttcc = new ArrayList(); + List ttdd = new ArrayList(); + List ppaa = new ArrayList(); + List ppbb = new ArrayList(); + List ppcc = new ArrayList(); + List ppdd = new ArrayList(); + List trop_a = new ArrayList(); + List trop_c = new ArrayList(); + List wmax_a = new ArrayList(); + List wmax_c = new ArrayList(); + for (int k = 0; k < recordArray.length; k++) { + NcUairRecord record = recordArray[k]; + if (record.getDataType().equals("TTAA") + || record.getDataType().equals("XXAA")) { + ttaa = getSndLayersFromNcUairRecordObsLevel(record); + trop_a = getSndLayersFromNcUairRecordTrop(record); + wmax_a = getSndLayersFromNcUairRecordMaxw(record); + } else if (record.getDataType().equals("TTBB") + || record.getDataType().equals("XXBB")) { + ttbb = getSndLayersFromNcUairRecordObsLevel(record); + } else if (record.getDataType().equals("TTCC") + || record.getDataType().equals("XXCC")) { + ttcc = getSndLayersFromNcUairRecordObsLevel(record); + trop_c = getSndLayersFromNcUairRecordTrop(record); + wmax_c = getSndLayersFromNcUairRecordMaxw(record); + } else if (record.getDataType().equals("TTDD") + || record.getDataType().equals("XXDD")) { + ttdd = getSndLayersFromNcUairRecordObsLevel(record); + } else if (record.getDataType().equals("PPAA")) { + ppaa = getSndLayersFromNcUairRecordObsLevel(record); + } else if (record.getDataType().equals("PPBB")) { + ppbb = getSndLayersFromNcUairRecordObsLevel(record); + } else if (record.getDataType().equals("PPCC")) { + ppcc = getSndLayersFromNcUairRecordObsLevel(record); + } else if (record.getDataType().equals("PPDD")) { + ppdd = getSndLayersFromNcUairRecordObsLevel(record); + } + } + pf = new NcSoundingProfile(); + pf.setStationElevation((float) recordArray[0] + .getElevation()); + pf.setStationId(recordArray[0].getStationId()); + if (recordArray[0].getStnum() != null + && recordArray[0].getStnum().length() > 0) + pf.setStationNum(Integer.parseInt(recordArray[0] + .getStnum())); + pf.setStationLatitude(recordArray[0].getLatitude()); + pf.setStationLongitude(recordArray[0].getLongitude()); + pf.setFcsTime(recordArray[0].getDataTime().getRefTime() + .getTime()); + // System.out.println(" input lat="+lat+" pf's lat="+pf.getStationLatitude()+" elv="+pf.getStationElevation()+" stnId="+pf.getStationId()); + sls = ms.mergeUairSounding(level, ttaa, ttbb, ttcc, + ttdd, ppaa, ppbb, ppcc, ppdd, trop_a, trop_c, + wmax_a, wmax_c, pf.getStationElevation()); + // System.out.println("NCUAIR Number of Layers after merge:"+sls.size() + // + " level="+level + + // " ms.isNumber(level)="+ms.isNumber(level)); + // for(NcSoundingLayer ly: sls){ + // System.out.println("Pre= "+ly.getPressure()+ + // " Dew= "+ ly.getDewpoint()+ " T= "+ + // ly.getTemperature()+" H="+ly.getGeoHeight()+" WSp="+ly.getWindSpeed()); + // } + + if (level.toUpperCase().equalsIgnoreCase("MAN")) + pf.setSoundingLyLst(sls); + else if (ms.isNumber(level) >= 0) { + if (sls.size() == 1) { + // System.out.println("NCUAIR get one layer using level = "+ + // level); + pf.setSoundingLyLst(sls); + } else { + pf = null; + // System.out.println("NCUAIR get 0 layer using level = "+ + // level); + } + } else { + if (sls.isEmpty() || sls.size() <= 1) + pf = null; + else + pf.setSoundingLyLst(sls); + } + } else + pf = null; + } + if (pf != null + && (pf.getSoundingLyLst2().size() > 0 || pf + .getSoundingLyLst().size() > 0)) { + // System.out.println(" pf is not null, so adding a profile to the list of NcSoundingProfiles "); + soundingProfileList.add(pf); + pf = null; + } + } + } + return soundingProfileList; + } + + /* + * Convert sounding data saved in NcSoundingLayer list to NcSoundingLayer2 + * list remove NcSoundingLayer data to have a smaller size for sending back + * to client + */ + private void convertPfcNcSoundingLayerToNcSoundingLayer2( + List pfLst) { + for (NcSoundingProfile pf : pfLst) { + List soundLy2List = new ArrayList(); + for (NcSoundingLayer level : pf.getSoundingLyLst()) { + NcSoundingLayer2 soundingLy2; + try { + soundingLy2 = new NcSoundingLayer2(); + AirTemperature airTemp; + airTemp = new AirTemperature(); + airTemp.setValue(new Amount(level.getTemperature(), + SI.CELSIUS)); + soundingLy2.setTemperature(airTemp); + + DewPointTemp dewPoint = new DewPointTemp(); + dewPoint.setValue(new Amount(level.getDewpoint(), + SI.CELSIUS)); + soundingLy2.setDewpoint(dewPoint); + + PressureLevel pressure = new PressureLevel(); + pressure.setValue(new Amount(level.getPressure(), + NcUnits.MILLIBAR)); + soundingLy2.setPressure(pressure); + + WindDirection windDirection = new WindDirection(); + windDirection.setValue(level.getWindDirection(), + NonSI.DEGREE_ANGLE); + soundingLy2.setWindDirection(windDirection); + + WindSpeed windSpeed = new WindSpeed(); + // HDF5 data in unit of Knots, no conversion needed + windSpeed.setValue(level.getWindSpeed(), NonSI.KNOT); + soundingLy2.setWindSpeed(windSpeed); + + HeightAboveSeaLevel height = new HeightAboveSeaLevel(); + height.setValue(level.getGeoHeight(), SI.METER); + soundingLy2.setGeoHeight(height); + + Omega omega = new Omega(); + omega.setValueAs(level.getOmega(), ""); + soundingLy2.setOmega(omega); + // soundingLy.setPressure(level.getPressure().floatValue()/100); + // soundingLy.setWindU(level.getUcWind().floatValue()); // + // HDF5 data in unit of Knots, no conversion needed + // soundingLy.setWindV(level.getVcWind().floatValue()); + // soundingLy.setSpecHumidity(level.getSpecificHumidity().floatValue()); + soundLy2List.add(soundingLy2); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + } + // Collections.sort(soundLyList,reversePressureComparator()); + pf.setSoundingLyLst2(soundLy2List); + pf.getSoundingLyLst().clear(); + } + } + + private void sysPrintProfileLayer2(List pfs) { + System.out + .println("-----------------------------------------------------------------\n sysPrintProfileLayer2: profile size =" + + pfs.size()); + for (int i = 0; i < pfs.size(); i++) { + if (pfs.get(i).getStationId().indexOf('K') == 0) { + System.out.println("pf" + i + " stn=" + + pfs.get(i).getStationId() + " lat/lon=" + + pfs.get(i).getStationLatitude() + "/" + + pfs.get(i).getStationLongitude()); + if (pfs.get(i).getSoundingLyLst2().size() > 0) { + System.out.println(" temp=" + + pfs.get(i).getSoundingLyLst2().get(0) + .getTemperature() + + " dewp=" + + pfs.get(i).getSoundingLyLst2().get(0) + .getDewpoint() + + " press=" + + pfs.get(i).getSoundingLyLst2().get(0) + .getPressure() + + " height=" + + pfs.get(i).getSoundingLyLst2().get(0) + .getGeoHeight() + + " windSp=" + + pfs.get(i).getSoundingLyLst2().get(0) + .getWindSpeed() + + " windDir=" + + pfs.get(i).getSoundingLyLst2().get(0) + .getWindDirection() + " omega=" + + pfs.get(i).getSoundingLyLst2().get(0).getOmega()); + } + } + } + } }