public Array readData(Variable v2, Section section) throws IOException, InvalidRangeException { // Vgroup vgroup = (Vgroup) v2.getSPobject(); // Range scanRange = section.getRange(0); // Range radialRange = section.getRange(1); // Range gateRange = section.getRange(2); Array data = Array.factory(v2.getDataType().getPrimitiveClassType(), section.getShape()); IndexIterator ii = data.getIndexIterator(); List<List<Ray>> groups; String shortName = v2.getShortName(); if (shortName.startsWith("Reflectivity")) groups = volScan.getReflectivityGroups(); else if (shortName.startsWith("Velocity")) groups = volScan.getVelocityGroups(); else if (shortName.startsWith("TotalPower")) groups = volScan.getTotalPowerGroups(); else if (shortName.startsWith("Width")) groups = volScan.getWidthGroups(); else if (shortName.startsWith("DiffReflectivity")) groups = volScan.getDifferentialReflectivityGroups(); else throw new IllegalStateException("Illegal variable name = " + shortName); if (section.getRank() == 2) { Range radialRange = section.getRange(0); Range gateRange = section.getRange(1); List<Ray> lli = groups.get(0); readOneScan(lli, radialRange, gateRange, ii); } else { Range scanRange = section.getRange(0); Range radialRange = section.getRange(1); Range gateRange = section.getRange(2); for (int i = scanRange.first(); i <= scanRange.last(); i += scanRange.stride()) { readOneScan(groups.get(i), radialRange, gateRange, ii); } } return data; }
/** * Fill all of the variables/attributes in the ncfile * * @param ncfile NetcdfFile object which will be filled. * @param bst number of seconds since midnight for start of sweep * @param yr year of start of each sweep * @param m month of start of each sweep * @param dda day of start of each sweep * @param varList ArrayList of Variables of ncfile * @param recHdr java.util.Map with values for Attributes */ public void doNetcdfFileCoordinate( ucar.nc2.NetcdfFile ncfile, int[] bst, short[] yr, short[] m, short[] dda, ArrayList<Variable> varList, java.util.Map<String, Number> recHdr) { // prepare attribute values String[] unit = {" ", "dbZ", "dbZ", "m/sec", "m/sec", "dB"}; String def_datafile = "SIGMET-IRIS"; Short header_length = 80; Short ray_header_length = 6; int ngates = 0; float radar_lat = recHdr.get("radar_lat").floatValue(); // System.out.println("rad_lat="+radar_lat); float radar_lon = recHdr.get("radar_lon").floatValue(); // System.out.println("rad_lon="+radar_lon); short ground_height = recHdr.get("ground_height").shortValue(); // System.out.println("ground_H="+ground_height); short radar_height = recHdr.get("radar_height").shortValue(); // System.out.println("radar_H="+radar_height); int radar_alt = (recHdr.get("radar_alt").intValue()) / 100; // System.out.println("rad_alt="+radar_alt); short num_rays = recHdr.get("num_rays").shortValue(); // System.out.println("HERE!! num_rays="+num_rays); float range_first = (recHdr.get("range_first").intValue()) * 0.01f; // System.out.println("range_1st="+range_first); float range_last = (recHdr.get("range_last").intValue()) * 0.01f; // System.out.println("step="+step); short number_sweeps = recHdr.get("number_sweeps").shortValue(); int nparams = (recHdr.get("nparams").intValue()); // System.out.println("nparams="+nparams); // define date/time // int last_t=(int)(ray[nparams*number_sweeps-1][num_rays-1].getTime()); int last_t = volScan.lastRay.getTime(); String sss1 = Short.toString(m[0]); if (sss1.length() < 2) sss1 = "0" + sss1; String sss2 = Short.toString(dda[0]); if (sss2.length() < 2) sss2 = "0" + sss2; String base_date0 = String.valueOf(yr[0]) + "-" + sss1 + "-" + sss2; String sss11 = Short.toString(m[number_sweeps - 1]); if (sss11.length() < 2) sss11 = "0" + sss11; String sss22 = Short.toString(dda[number_sweeps - 1]); if (sss22.length() < 2) sss22 = "0" + sss22; String base_date1 = String.valueOf(yr[number_sweeps - 1]) + "-" + sss11 + "-" + sss22; String start_time = base_date0 + "T" + calcTime(bst[0], 0) + "Z"; String end_time = base_date1 + "T" + calcTime(bst[number_sweeps - 1], last_t) + "Z"; ncfile.addAttribute(null, new Attribute("time_coverage_start", start_time)); ncfile.addAttribute(null, new Attribute("time_coverage_end", end_time)); // set all of Variables try { int sz = varList.size(); ArrayFloat.D2[] dataArr = new ArrayFloat.D2[nparams * number_sweeps]; Index[] dataIndex = new Index[nparams * number_sweeps]; Ray[] rtemp = new Ray[(int) num_rays]; // NCdump.printArray(dataArr[0], "Total_Power", System.out, null); Variable[] distanceR = new Variable[number_sweeps]; ArrayFloat.D1[] distArr = new ArrayFloat.D1[number_sweeps]; Index[] distIndex = new Index[number_sweeps]; String distName = "distanceR"; for (int i = 0; i < number_sweeps; i++) { if (number_sweeps > 1) { distName = "distanceR_sweep_" + (i + 1); } for (Variable aVarList : varList) { if ((aVarList.getShortName()).equals(distName.trim())) { distanceR[i] = aVarList; break; } } distArr[i] = (ArrayFloat.D1) Array.factory(DataType.FLOAT, distanceR[i].getShape()); distIndex[i] = distArr[i].getIndex(); // for (int jj=0; jj<num_rays; jj++) { rtemp[jj]=ray[i][jj]; } ngates = sweep_bins[i]; float stp = calcStep(range_first, range_last, (short) ngates); for (int ii = 0; ii < ngates; ii++) { distArr[i].setFloat(distIndex[i].set(ii), (range_first + ii * stp)); } } // NCdump.printArray(distArr[0], "distanceR", System.out, null); List rgp = volScan.getTotalPowerGroups(); if (rgp.size() == 0) rgp = volScan.getReflectivityGroups(); List[] sgp = new ArrayList[number_sweeps]; for (int i = 0; i < number_sweeps; i++) { sgp[i] = (List) rgp.get((short) i); } Variable[] time = new Variable[number_sweeps]; ArrayInt.D1[] timeArr = new ArrayInt.D1[number_sweeps]; Index[] timeIndex = new Index[number_sweeps]; String t_n = "time"; for (int i = 0; i < number_sweeps; i++) { if (number_sweeps > 1) { t_n = "time_sweep_" + (i + 1); } for (Variable aVarList : varList) { if ((aVarList.getShortName()).equals(t_n.trim())) { time[i] = aVarList; break; } } // if (time[i].getShape().length == 0) { // continue; // } timeArr[i] = (ArrayInt.D1) Array.factory(DataType.INT, time[i].getShape()); timeIndex[i] = timeArr[i].getIndex(); List rlist = sgp[i]; for (int jj = 0; jj < num_rays; jj++) { rtemp[jj] = (Ray) rlist.get(jj); } // ray[i][jj]; } for (int jj = 0; jj < num_rays; jj++) { timeArr[i].setInt(timeIndex[i].set(jj), rtemp[jj].getTime()); } } // NCdump.printArray(timeArr[0], "time", System.out, null); Variable[] azimuthR = new Variable[number_sweeps]; ArrayFloat.D1[] azimArr = new ArrayFloat.D1[number_sweeps]; Index[] azimIndex = new Index[number_sweeps]; String azimName = "azimuthR"; for (int i = 0; i < number_sweeps; i++) { if (number_sweeps > 1) { azimName = "azimuthR_sweep_" + (i + 1); } for (Variable aVarList : varList) { if ((aVarList.getShortName()).equals(azimName.trim())) { azimuthR[i] = aVarList; break; } } azimArr[i] = (ArrayFloat.D1) Array.factory(DataType.FLOAT, azimuthR[i].getShape()); azimIndex[i] = azimArr[i].getIndex(); List rlist = sgp[i]; for (int jj = 0; jj < num_rays; jj++) { rtemp[jj] = (Ray) rlist.get(jj); } // ray[i][jj]; } for (int jj = 0; jj < num_rays; jj++) { azimArr[i].setFloat(azimIndex[i].set(jj), rtemp[jj].getAz()); } } // NCdump.printArray(azimArr[0], "azimuthR", System.out, null); Variable[] elevationR = new Variable[number_sweeps]; ArrayFloat.D1[] elevArr = new ArrayFloat.D1[number_sweeps]; Index[] elevIndex = new Index[number_sweeps]; String elevName = "elevationR"; for (int i = 0; i < number_sweeps; i++) { if (number_sweeps > 1) { elevName = "elevationR_sweep_" + (i + 1); } for (Variable aVarList : varList) { if ((aVarList.getShortName()).equals(elevName.trim())) { elevationR[i] = aVarList; break; } } elevArr[i] = (ArrayFloat.D1) Array.factory(DataType.FLOAT, elevationR[i].getShape()); elevIndex[i] = elevArr[i].getIndex(); List rlist = sgp[i]; for (int jj = 0; jj < num_rays; jj++) { rtemp[jj] = (Ray) rlist.get(jj); } // ray[i][jj]; } for (int jj = 0; jj < num_rays; jj++) { elevArr[i].setFloat(elevIndex[i].set(jj), rtemp[jj].getElev()); } } // NCdump.printArray(elevArr[0], "elevationR", System.out, null); Variable numGates = null; for (int i = 0; i < number_sweeps; i++) { for (Variable aVarList : varList) { if ((aVarList.getShortName()).equals("numGates")) { numGates = aVarList; break; } } } ArrayInt.D1 gatesArr = (ArrayInt.D1) Array.factory(DataType.INT, numGates.getShape()); Index gatesIndex = gatesArr.getIndex(); for (int i = 0; i < number_sweeps; i++) { List rlist = sgp[i]; for (int jj = 0; jj < num_rays; jj++) { rtemp[jj] = (Ray) rlist.get(jj); } // ray[i][jj]; } ngates = rtemp[0].getBins(); gatesArr.setInt(gatesIndex.set(i), ngates); } for (int i = 0; i < number_sweeps; i++) { distanceR[i].setCachedData(distArr[i], false); time[i].setCachedData(timeArr[i], false); azimuthR[i].setCachedData(azimArr[i], false); elevationR[i].setCachedData(elevArr[i], false); } numGates.setCachedData(gatesArr, false); // startSweep.setCachedData(sweepArr, false); // ------------------------------------------------- // int b=(int)ray[0][0].getBins(); // -- Test of readData() and readToByteChannel() ----------------- /* Range r1=new Range(356, 359); Range r2=new Range(0, 15); java.util.List arlist=new ArrayList(); arlist.add(r1); arlist.add(r2); Array testArr=readData(v[0], new Section(arlist)); NCdump.printArray(testArr, "Total_Power_sweep_1", System.out, null); WritableByteChannel channel=new FileOutputStream(new File("C:\\netcdf\\tt.dat")).getChannel(); long ikk=readToByteChannel(v[0], new Section(arlist), channel); System.out.println("IKK="+ikk); channel.close(); */ // --------------------------------------------------- } catch (Exception e) { System.out.println(e.toString()); e.printStackTrace(); } } // ----------- end of doNetcdf ----------------------------------
/** * Define Dimensions, Variables, Attributes in ncfile * * @param raf ucar.unidata.io.RandomAccessFile corresponds of SIGMET datafile. * @param ncfile an empty NetcdfFile object which will be filled. * @param hdrNames java.util.Map with values for "StationName.." Attributes * @return ArrayList of Variables of ncfile */ public ArrayList<Variable> init( ucar.unidata.io.RandomAccessFile raf, ucar.nc2.NetcdfFile ncfile, java.util.Map<String, String> hdrNames) throws java.io.IOException { // prepare attribute values String[] data_name = { " ", "TotalPower", "Reflectivity", "Velocity", "Width", "Differential_Reflectivity" }; String[] unit = {" ", "dbZ", "dbZ", "m/sec", "m/sec", "dB"}; int[] type = {1, 2, 3, 4, 5}; String def_datafile = "SIGMET-IRIS"; String tim = ""; int ngates = 0; recHdr = readRecordsHdr(raf); hdrNames = readStnNames(raf); String stnName = hdrNames.get("StationName"); String stnName_util = hdrNames.get("StationName_SetupUtility"); float radar_lat = recHdr.get("radar_lat").floatValue(); // System.out.println("rad_lat="+radar_lat); float radar_lon = recHdr.get("radar_lon").floatValue(); // System.out.println("rad_lon="+radar_lon); short ground_height = recHdr.get("ground_height").shortValue(); // System.out.println("ground_H="+ground_height); short radar_height = recHdr.get("radar_height").shortValue(); // System.out.println("radar_H="+radar_height); int radar_alt = (recHdr.get("radar_alt").intValue()) / 100; // System.out.println("rad_alt="+radar_alt); short num_rays = recHdr.get("num_rays").shortValue(); // System.out.println("num_rays="+num_rays); short bins = recHdr.get("bins").shortValue(); // System.out.println("bins="+bins); float range_first = (recHdr.get("range_first").intValue()) * 0.01f; // System.out.println("range_1st="+range_first); float range_last = (recHdr.get("range_last").intValue()) * 0.01f; // System.out.println("step="+step); short number_sweeps = recHdr.get("number_sweeps").shortValue(); // System.out.println("number_sweeps="+number_sweeps); int nparams = (recHdr.get("nparams").intValue()); // System.out.println("nparams="+nparams); short year = recHdr.get("year").shortValue(); // System.out.println("year="+year); short month = recHdr.get("month").shortValue(); short day = recHdr.get("day").shortValue(); int base_time = (recHdr.get("base_time").intValue()); // define number of gates for every sweep sweep_bins = new int[nparams * number_sweeps]; if (number_sweeps > 1) { sweep_bins = volScan.getNumberGates(); } else { for (int kk = 0; kk < nparams; kk++) { sweep_bins[kk] = bins; } } // add Dimensions Dimension scanR = new Dimension("scanR", number_sweeps, true); Dimension radial = new Dimension("radial", num_rays, true); Dimension[] gateR = new Dimension[number_sweeps]; String dim_name = "gateR"; for (int j = 0; j < number_sweeps; j++) { if (number_sweeps > 1) { dim_name = "gateR_sweep_" + (j + 1); } gateR[j] = new Dimension(dim_name, sweep_bins[j], true); } ncfile.addDimension(null, scanR); ncfile.addDimension(null, radial); for (int j = 0; j < number_sweeps; j++) { ncfile.addDimension(null, gateR[j]); } ArrayList<Dimension> dims0 = new ArrayList<Dimension>(); ArrayList<Dimension> dims1 = new ArrayList<Dimension>(); ArrayList<Dimension> dims2 = new ArrayList<Dimension>(); ArrayList<Dimension> dims3 = new ArrayList<Dimension>(); ArrayList<Variable> varList = new ArrayList<Variable>(); Variable[][] v = new Variable[nparams][number_sweeps]; String var_name = ""; for (int j = 0; j < nparams; j++) { int tp = type[j]; var_name = data_name[tp]; for (int jj = 0; jj < number_sweeps; jj++) { if (number_sweeps > 1) { var_name = data_name[tp] + "_sweep_" + (jj + 1); } v[j][jj] = new Variable(ncfile, null, null, var_name); v[j][jj].setDataType(DataType.FLOAT); dims2.add(radial); dims2.add(gateR[jj]); v[j][jj].setDimensions(dims2); v[j][jj].addAttribute(new Attribute(CDM.LONG_NAME, var_name)); v[j][jj].addAttribute(new Attribute(CDM.UNITS, unit[tp])); String coordinates = "time elevationR azimuthR distanceR"; v[j][jj].addAttribute(new Attribute(_Coordinate.Axes, coordinates)); v[j][jj].addAttribute(new Attribute(CDM.MISSING_VALUE, -999.99f)); ncfile.addVariable(null, v[j][jj]); varList.add(v[j][jj]); dims2.clear(); } } tsu_sec = new int[number_sweeps]; String[] tsu = new String[number_sweeps]; String[] time_units = new String[number_sweeps]; tsu_sec = volScan.getStartSweep(); for (int i = 0; i < number_sweeps; i++) { String st1 = Short.toString(month); if (st1.length() < 2) st1 = "0" + st1; String st2 = Short.toString(day); if (st2.length() < 2) st2 = "0" + st2; date0 = String.valueOf(year) + "-" + st1 + "-" + st2; tsu[i] = date0 + "T" + calcTime(tsu_sec[i], 0) + "Z"; } for (int j = 0; j < number_sweeps; j++) { time_units[j] = "secs since " + tsu[j]; } dims0.add(radial); // add "time" variable Variable[] time = new Variable[number_sweeps]; String tm = "time"; String tm_name = ""; for (int j = 0; j < number_sweeps; j++) { tm_name = tm; if (number_sweeps > 1) { tm_name = tm + "_sweep_" + (j + 1); } time[j] = new Variable(ncfile, null, null, tm_name); time[j].setDataType(DataType.INT); time[j].setDimensions(dims0); time[j].addAttribute(new Attribute(CDM.LONG_NAME, "time from start of sweep")); time[j].addAttribute(new Attribute(CDM.UNITS, time_units[j])); time[j].addAttribute(new Attribute(_Coordinate.AxisType, AxisType.Time.toString())); time[j].addAttribute(new Attribute(CDM.MISSING_VALUE, -99)); ncfile.addVariable(null, time[j]); varList.add(time[j]); } // add "elevationR" variable Variable[] elevationR = new Variable[number_sweeps]; String ele = "elevationR"; String ele_name = ""; for (int j = 0; j < number_sweeps; j++) { ele_name = ele; if (number_sweeps > 1) { ele_name = ele + "_sweep_" + (j + 1); } elevationR[j] = new Variable(ncfile, null, null, ele_name); elevationR[j].setDataType(DataType.FLOAT); elevationR[j].setDimensions(dims0); elevationR[j].addAttribute(new Attribute(CDM.LONG_NAME, "elevation angle")); elevationR[j].addAttribute(new Attribute(CDM.UNITS, "degrees")); elevationR[j].addAttribute( new Attribute(_Coordinate.AxisType, AxisType.RadialElevation.toString())); elevationR[j].addAttribute(new Attribute(CDM.MISSING_VALUE, -999.99f)); ncfile.addVariable(null, elevationR[j]); varList.add(elevationR[j]); } // add "azimuthR" variable Variable[] azimuthR = new Variable[number_sweeps]; String azim = "azimuthR"; String azim_name = ""; for (int j = 0; j < number_sweeps; j++) { azim_name = azim; if (number_sweeps > 1) { azim_name = azim + "_sweep_" + (j + 1); } azimuthR[j] = new Variable(ncfile, null, null, azim_name); azimuthR[j].setDataType(DataType.FLOAT); azimuthR[j].setDimensions(dims0); azimuthR[j].addAttribute(new Attribute(CDM.LONG_NAME, "azimuth angle")); azimuthR[j].addAttribute(new Attribute(CDM.UNITS, "degrees")); azimuthR[j].addAttribute( new Attribute(_Coordinate.AxisType, AxisType.RadialAzimuth.toString())); azimuthR[j].addAttribute(new Attribute(CDM.MISSING_VALUE, -999.99f)); ncfile.addVariable(null, azimuthR[j]); varList.add(azimuthR[j]); } // add "distanceR" variable Variable[] distanceR = new Variable[number_sweeps]; String dName = "distanceR"; String dist_name = ""; for (int j = 0; j < number_sweeps; j++) { dist_name = dName; if (number_sweeps > 1) { dist_name = dName + "_sweep_" + (j + 1); } distanceR[j] = new Variable(ncfile, null, null, dist_name); distanceR[j].setDataType(DataType.FLOAT); dims1.add(gateR[j]); distanceR[j].setDimensions(dims1); distanceR[j].addAttribute(new Attribute(CDM.LONG_NAME, "radial distance")); distanceR[j].addAttribute(new Attribute(CDM.UNITS, "m")); distanceR[j].addAttribute( new Attribute(_Coordinate.AxisType, AxisType.RadialDistance.toString())); ncfile.addVariable(null, distanceR[j]); varList.add(distanceR[j]); dims1.clear(); } // add "numGates" variable dims3.add(scanR); Variable numGates = new Variable(ncfile, null, null, "numGates"); numGates.setDataType(DataType.INT); numGates.setDimensions(dims3); numGates.addAttribute(new Attribute(CDM.LONG_NAME, "number of gates in the sweep")); ncfile.addVariable(null, numGates); varList.add(numGates); // add global attributes ncfile.addAttribute(null, new Attribute("definition", "SIGMET-IRIS RAW")); ncfile.addAttribute( null, new Attribute("description", "SIGMET-IRIS data are reading by Netcdf IOSP")); ncfile.addAttribute(null, new Attribute("StationName", stnName)); ncfile.addAttribute(null, new Attribute("StationName_SetupUtility", stnName_util)); ncfile.addAttribute(null, new Attribute("radar_lat", radar_lat)); ncfile.addAttribute(null, new Attribute("radar_lon", radar_lon)); ncfile.addAttribute(null, new Attribute("ground_height", ground_height)); ncfile.addAttribute(null, new Attribute("radar_height", radar_height)); ncfile.addAttribute(null, new Attribute("radar_alt", radar_alt)); ncfile.addAttribute(null, new Attribute("num_data_types", nparams)); ncfile.addAttribute(null, new Attribute("number_sweeps", number_sweeps)); String sn = "start_sweep"; String snn = ""; for (int j = 0; j < number_sweeps; j++) { snn = sn; if (number_sweeps > 1) { snn = sn + "_" + (j + 1); } ncfile.addAttribute(null, new Attribute(snn, tsu[j])); } ncfile.addAttribute(null, new Attribute("num_rays", num_rays)); ncfile.addAttribute(null, new Attribute("max_number_gates", bins)); ncfile.addAttribute(null, new Attribute("range_first", range_first)); ncfile.addAttribute(null, new Attribute("range_last", range_last)); ncfile.addAttribute(null, new Attribute("DataType", "Radial")); ncfile.addAttribute(null, new Attribute(CDM.CONVENTIONS, _Coordinate.Convention)); // --------- fill all of values in the ncfile ------ doNetcdfFileCoordinate( ncfile, volScan.base_time, volScan.year, volScan.month, volScan.day, varList, recHdr); ncfile.finish(); return varList; }