All Downloads are FREE. Search and download functionalities are using the official Maven repository.

ucar.nc2.iosp.sigmet.Ray Maven / Gradle / Ivy

The newest version!
/*
 * Copyright (c) 1998-2018 John Caron and University Corporation for Atmospheric Research/Unidata
 * See LICENSE for license information.
 */

package ucar.nc2.iosp.sigmet;

import ucar.ma2.IndexIterator;
import ucar.ma2.Range;
import ucar.unidata.io.RandomAccessFile;

import java.io.IOException;
import java.util.Comparator;
import java.util.Formatter;

/**
 * @author yuanho
 * @since Apr 7, 2010
 */
public class Ray {
  private short bins;
  int dataRead;
  int offset;
  int offset1;
  private float range, step, az, elev;
  private short time;
  //  private float[] val;
  String varName;
  int nsweep;
  short datatype;


  public Ray(float range, float step, float az, float elev, short bins, short time, int offset, int dataRead,
             int offset1, int nsweep, String name,
             short datatype) {

    //  this.val = new float[bins];
    setRange(range);
    setStep(step);
    setAz(az);
    setElev(elev);
    setBins(bins);
    setTime(time);
    setOffset(offset);
    setDataRead(dataRead);
    setOffset1(offset1);
    // setVal(val);
    setName(name);
    setNsweep(nsweep);
    setDataType(datatype);

  }

  public short getDataType() {
    return datatype;
  }

  public void setDataType(short datatype) {
    this.datatype = datatype;
  }

  public float getRange() {
    return range;
  }

  public void setRange(float range) {
    this.range = range;
  }

  public float getStep() {
    return step;
  }

  public void setStep(float step) {
    this.step = step;
  }

  public int getNsweep() {
    return nsweep;
  }

  public void setNsweep(int nsweep) {
    this.nsweep = nsweep;
  }

  public float getAz() {
    if (az < 0.0f & az > -361.0f) {
      az = 360.0f + az;
    }

    return az;
  }

  public void setAz(float az) {
    this.az = az;
  }

  public float getElev() {
    return elev;
  }

  public void setElev(float elev) {
    this.elev = elev;
  }

  public short getBins() {
    return bins;
  }

  public void setBins(short bins) {
    this.bins = bins;
  }

  public short getTime() {
    return time;
  }

  public void setTime(short time) {
    this.time = time;
  }

  public int getOffset() {
    return offset;
  }

  public void setOffset(int offset) {
    this.offset = offset;
  }

  public int getDataRead() {
    return dataRead;
  }

  public void setDataRead(int dataRead) {
    this.dataRead = dataRead;
  }

  public int getOffset1() {
    return offset1;
  }

  public void setOffset1(int offset1) {
    this.offset1 = offset1;
  }

  /*   public float[] getVal() {
        return val;
    }

    public void setVal(float[] val) {
        System.arraycopy(val, 0, this.val, 0, bins);
    }
  */
  public void setName(String name) {
    this.varName = name;
  }

  public String getName() {
    return varName;
  }

  public boolean equals(Object o) {
    if (this == o) {
      return true;
    } else if (o instanceof Ray) {
      Ray oo = (Ray) o;

      return (range == oo.range & step == oo.step & az == oo.az & elev == oo.elev & bins == oo.bins
              & time == oo.time);
    } else {
      return false;
    }
  }

  public int hashCode() {
    return new Float(range).hashCode() + new Float(step).hashCode() + new Float(az).hashCode()
            + new Float(elev).hashCode() + new Short(bins).hashCode() + new Short(time).hashCode();

    // val.hashCode();
  }

  public String toString() {
    Formatter sb = new Formatter();

    sb.format("Range=%f Step=%f", range, step);
    if (az > -361.0f & az < 0.0f) {
      az = 360.0f + az;
    }

    sb.format(" Az=%f Elev=%f Bins=%d Time=%d", az, elev, bins, time);
    // for (int i=0; i 0) {
      raf.seek(offset);

      for (int i = 0; i < dataRead; i++) {
        d = raf.readByte();
        dd[i] = SigmetIOServiceProvider.calcData(SigmetIOServiceProvider.recHdr, getDataType(), d);
        nb++;
      }
    }
    // System.out.println("this is az " + getAz());
    raf.seek(offset1);
    int cur_len = offset1;

    while (nb < (int) bins) {
      // --- Check if the code=1 ("1" means an end of a ray)
      a00 = raf.readShort();
      cur_len = cur_len + 2;

      if (a00 == (short) 1) {
        for (int uk = 0; uk < (int) bins; uk++) {
          dd[uk] = -999.99f;
        }
        break;
      }

      if (a00 < 0) {    // -- This is data
        int nwords = a00 & 0x7fff;
        int dataRead1 = nwords * 2;
        int pos = 0;
        if (cur_len % REC_SIZE == 0) {
          pos = 0;
          break;
        }
        raf.seek(cur_len);
        for (int i = 0; i < dataRead1; i++) {
          d = raf.readByte();
          dd[nb] = SigmetIOServiceProvider.calcData(SigmetIOServiceProvider.recHdr, getDataType(), d);
          nb = nb + 1;
          cur_len = cur_len + 1;
          if (nb % REC_SIZE == 0) {
            pos = i + 1;
            break;
          }
        }

        if (pos > 0) {
          break;
        }
      } else if (a00 > 0 & a00 != 1) {
        int num_zero = a00 * 2;
        int dataRead1 = num_zero;
        for (int k = 0; k < dataRead1; k++) {
          dd[nb + k] = SigmetIOServiceProvider.calcData(SigmetIOServiceProvider.recHdr, getDataType(), (byte) 0);
        }
        nb = nb + dataRead1;
        if (cur_len % REC_SIZE == 0) {
          break;
        }

      }
    }                     // ------ end of while for num_bins---------------------------------

    for (int gateIdx : gateRange) {
      if (gateIdx >= bins)
        ii.setFloatNext(Float.NaN);
      else
        ii.setFloatNext(dd[gateIdx]);
    }

  } // end of readData
}    // class Ray end------------------------------------------

 




© 2015 - 2024 Weber Informatics LLC | Privacy Policy