public void runTest(Object ctx, int numReps) { final Context ictx = (Context) ctx; final ImageInputStream iis = ictx.inputStream; final int length = ictx.length; int pos = 0; try { iis.mark(); do { if (pos + 4 > length) { iis.reset(); iis.mark(); pos = 0; } iis.readFloat(); pos += 4; } while (--numReps >= 0); } catch (IOException e) { e.printStackTrace(); } finally { try { iis.reset(); } catch (IOException e) { } } }
/** * reads an AOT LUT (BBDR breadboard procedure GA_read_LUT_AOD) * This LUT is equivalent to the * original IDL LUT: for bd = 0, nm_bnd - 1 do $ for jj = 0, nm_aot - 1 do $ for ii = 0, nm_hsf - * 1 do $ for k = 0, nm_azm - 1 do $ for j = 0, nm_asl - 1 do $ for i = 0, nm_avs - 1 do begin * readu, 1, aux lut[*, i, j, nm_azm - k - 1, ii, jj, bd] = aux A LUT value can be accessed with * lut.getValue(new double[]{wvlValue, aotValue, hsfValue, aziValue, szaValue, vzaValue, * parameterValue}); * * @param sensor The sensor * @return LookupTable * @throws java.io.IOException when failing to real LUT data */ public static AotLookupTable getAotLookupTable(Sensor sensor) throws IOException { ImageInputStream iis = Luts.getAotLutData(sensor.getInstrument()); try { // read LUT dimensions and values float[] vza = Luts.readDimension(iis); int nVza = vza.length; float[] sza = Luts.readDimension(iis); int nSza = sza.length; float[] azi = Luts.readDimension(iis); int nAzi = azi.length; float[] hsf = Luts.readDimension(iis); int nHsf = hsf.length; // conversion from surf.pressure to elevation ASL for (int i = 0; i < nHsf; i++) { if (hsf[i] != -1) { // 1.e-3 * (1.d - (xnodes[3, wh_nod] / 1013.25)^(1./5.25588)) / 2.25577e-5 final double a = hsf[i] / 1013.25; final double b = 1. / 5.25588; hsf[i] = (float) (0.001 * (1.0 - Math.pow(a, b)) / 2.25577E-5); } } float[] aot = Luts.readDimension(iis); int nAot = aot.length; float[] parameters = new float[] {1.0f, 2.0f, 3.0f, 4.0f, 5.0f}; int nParameters = parameters.length; float[] wvl = sensor.getWavelength(); final int nWvl = wvl.length; float[] tgLut = new float[nParameters * nVza * nSza * nAzi * nHsf * nAot * nWvl]; for (int iWvl = 0; iWvl < nWvl; iWvl++) { for (int iAot = 0; iAot < nAot; iAot++) { for (int iHsf = 0; iHsf < nHsf; iHsf++) { for (int iAzi = 0; iAzi < nAzi; iAzi++) { for (int iSza = 0; iSza < nSza; iSza++) { for (int iVza = 0; iVza < nVza; iVza++) { for (int iParams = 0; iParams < nParameters; iParams++) { int iAziTemp = nAzi - iAzi - 1; int i = iParams + nParameters * (iVza + nVza * (iSza + nSza * (iAziTemp + nAzi * (iHsf + nHsf * (iAot + nAot * iWvl))))); tgLut[i] = iis.readFloat(); } } } } } } } Luts.readDimension(iis, nWvl); // skip wavelengths float[] solarIrradiances = Luts.readDimension(iis, nWvl); // store in original sequence (see breadboard: loop over bd, jj, ii, k, j, i in // GA_read_lut_AOD AotLookupTable aotLut = new AotLookupTable(); aotLut.setLut(new LookupTable(tgLut, wvl, aot, hsf, azi, sza, vza, parameters)); aotLut.setWvl(wvl); aotLut.setSolarIrradiance(solarIrradiances); return aotLut; } finally { iis.close(); } }
public void initialize( ImageInputStream stream, boolean ignoreUnknownFields, final boolean isBTIFF) throws IOException { removeTIFFFields(); List tagSetList = getTagSetList(); final long numEntries; if (isBTIFF) numEntries = stream.readLong(); else numEntries = stream.readUnsignedShort(); for (int i = 0; i < numEntries; i++) { // Read tag number, value type, and value count. int tag = stream.readUnsignedShort(); int type = stream.readUnsignedShort(); int count; if (isBTIFF) { long count_ = stream.readLong(); count = (int) count_; if (count != count_) throw new IllegalArgumentException("unable to use long number of values"); } else count = (int) stream.readUnsignedInt(); // Get the associated TIFFTag. TIFFTag tiffTag = getTag(tag, tagSetList); // Ignore unknown fields. if (ignoreUnknownFields && tiffTag == null) { // Skip the value/offset so as to leave the stream // position at the start of the next IFD entry. if (isBTIFF) stream.skipBytes(8); else stream.skipBytes(4); // XXX Warning message ... // Continue with the next IFD entry. continue; } long nextTagOffset; if (isBTIFF) { nextTagOffset = stream.getStreamPosition() + 8; int sizeOfType = TIFFTag.getSizeOfType(type); if (count * sizeOfType > 8) { long value = stream.readLong(); stream.seek(value); } } else { nextTagOffset = stream.getStreamPosition() + 4; int sizeOfType = TIFFTag.getSizeOfType(type); if (count * sizeOfType > 4) { long value = stream.readUnsignedInt(); stream.seek(value); } } if (tag == BaselineTIFFTagSet.TAG_STRIP_BYTE_COUNTS || tag == BaselineTIFFTagSet.TAG_TILE_BYTE_COUNTS || tag == BaselineTIFFTagSet.TAG_JPEG_INTERCHANGE_FORMAT_LENGTH) { this.stripOrTileByteCountsPosition = stream.getStreamPosition(); if (LAZY_LOADING) { type = type == TIFFTag.TIFF_LONG ? TIFFTag.TIFF_LAZY_LONG : TIFFTag.TIFF_LAZY_LONG8; } } else if (tag == BaselineTIFFTagSet.TAG_STRIP_OFFSETS || tag == BaselineTIFFTagSet.TAG_TILE_OFFSETS || tag == BaselineTIFFTagSet.TAG_JPEG_INTERCHANGE_FORMAT) { this.stripOrTileOffsetsPosition = stream.getStreamPosition(); if (LAZY_LOADING) { type = type == TIFFTag.TIFF_LONG ? TIFFTag.TIFF_LAZY_LONG : TIFFTag.TIFF_LAZY_LONG8; } } Object obj = null; try { switch (type) { case TIFFTag.TIFF_BYTE: case TIFFTag.TIFF_SBYTE: case TIFFTag.TIFF_UNDEFINED: case TIFFTag.TIFF_ASCII: byte[] bvalues = new byte[count]; stream.readFully(bvalues, 0, count); if (type == TIFFTag.TIFF_ASCII) { // Can be multiple strings final List<String> v = new ArrayList<String>(); boolean inString = false; int prevIndex = 0; for (int index = 0; index <= count; index++) { if (index < count && bvalues[index] != 0) { if (!inString) { // start of string prevIndex = index; inString = true; } } else { // null or special case at end of string if (inString) { // end of string final String s = new String(bvalues, prevIndex, index - prevIndex); v.add(s); inString = false; } } } count = v.size(); String[] strings; if (count != 0) { strings = new String[count]; for (int c = 0; c < count; c++) { strings[c] = v.get(c); } } else { // This case has been observed when the value of // 'count' recorded in the field is non-zero but // the value portion contains all nulls. count = 1; strings = new String[] {""}; } obj = strings; } else { obj = bvalues; } break; case TIFFTag.TIFF_SHORT: char[] cvalues = new char[count]; for (int j = 0; j < count; j++) { cvalues[j] = (char) (stream.readUnsignedShort()); } obj = cvalues; break; case TIFFTag.TIFF_LONG: case TIFFTag.TIFF_IFD_POINTER: long[] lvalues = new long[count]; for (int j = 0; j < count; j++) { lvalues[j] = stream.readUnsignedInt(); } obj = lvalues; break; case TIFFTag.TIFF_RATIONAL: long[][] llvalues = new long[count][2]; for (int j = 0; j < count; j++) { llvalues[j][0] = stream.readUnsignedInt(); llvalues[j][1] = stream.readUnsignedInt(); } obj = llvalues; break; case TIFFTag.TIFF_SSHORT: short[] svalues = new short[count]; for (int j = 0; j < count; j++) { svalues[j] = stream.readShort(); } obj = svalues; break; case TIFFTag.TIFF_SLONG: int[] ivalues = new int[count]; for (int j = 0; j < count; j++) { ivalues[j] = stream.readInt(); } obj = ivalues; break; case TIFFTag.TIFF_SRATIONAL: int[][] iivalues = new int[count][2]; for (int j = 0; j < count; j++) { iivalues[j][0] = stream.readInt(); iivalues[j][1] = stream.readInt(); } obj = iivalues; break; case TIFFTag.TIFF_FLOAT: float[] fvalues = new float[count]; for (int j = 0; j < count; j++) { fvalues[j] = stream.readFloat(); } obj = fvalues; break; case TIFFTag.TIFF_DOUBLE: double[] dvalues = new double[count]; for (int j = 0; j < count; j++) { dvalues[j] = stream.readDouble(); } obj = dvalues; break; case TIFFTag.TIFF_LONG8: case TIFFTag.TIFF_SLONG8: case TIFFTag.TIFF_IFD8: long[] lBvalues = new long[count]; for (int j = 0; j < count; j++) { lBvalues[j] = stream.readLong(); } obj = lBvalues; break; case TIFFTag.TIFF_LAZY_LONG8: case TIFFTag.TIFF_LAZY_LONG: obj = new TIFFLazyData(stream, type, count); break; default: // XXX Warning break; } } catch (EOFException eofe) { // The TIFF 6.0 fields have tag numbers less than or equal // to 532 (ReferenceBlackWhite) or equal to 33432 (Copyright). // If there is an error reading a baseline tag, then re-throw // the exception and fail; otherwise continue with the next // field. if (BaselineTIFFTagSet.getInstance().getTag(tag) == null) { throw eofe; } } if (tiffTag == null) { // XXX Warning: unknown tag } else if (!tiffTag.isDataTypeOK(type)) { // XXX Warning: bad data type } else if (tiffTag.isIFDPointer() && obj != null) { stream.mark(); stream.seek(((long[]) obj)[0]); List tagSets = new ArrayList(1); tagSets.add(tiffTag.getTagSet()); TIFFIFD subIFD = new TIFFIFD(tagSets); // XXX Use same ignore policy for sub-IFD fields? subIFD.initialize(stream, ignoreUnknownFields); obj = subIFD; stream.reset(); } if (tiffTag == null) { tiffTag = new TIFFTag(null, tag, 1 << type, null); } // Add the field if its contents have been initialized which // will not be the case if an EOF was ignored above. if (obj != null) { TIFFField f = new TIFFField(tiffTag, type, count, obj); addTIFFField(f); } stream.seek(nextTagOffset); } this.lastPosition = stream.getStreamPosition(); }