Changeset 7794 for trunk


Ignore:
Timestamp:
10/14/11 13:29:34 (8 years ago)
Author:
aivar
Message:

Better handle ICS excitation files.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/projects/slim-plugin/src/main/java/loci/slim/ExcitationFileHandler.java

    r7674 r7794  
    118118        try { 
    119119            icsReader.setId(fileName); 
    120             //System.out.println(" is single file " + icsReader.isSingleFile(fileName)); 
    121             String domains[] = icsReader.getDomains(); 
    122             int lengths[] = icsReader.getChannelDimLengths(); 
    123             //System.out.print("lengths"); 
    124             //for (int i : lengths) { 
    125             //    System.out.print(" " + i); 
    126             //} 
    127             //System.out.println(); 
    128             String types[] = icsReader.getChannelDimTypes(); 
    129             int sizeX = icsReader.getSizeX(); 
    130             int sizeY = icsReader.getSizeY(); 
    131             int sizeZ = icsReader.getSizeZ(); 
    132             int sizeT = icsReader.getSizeT(); 
    133             int sizeC = icsReader.getSizeC(); 
    134             int bpp = icsReader.getBitsPerPixel(); 
    135             String dimOrder = icsReader.getDimensionOrder(); 
    136             int pixelType = icsReader.getPixelType(); 
    137             int effSizeC = icsReader.getEffectiveSizeC(); 
     120            int bitsPerPixel = icsReader.getBitsPerPixel(); 
     121            int bytesPerPixel = bitsPerPixel / 8; 
    138122            boolean littleEndian = icsReader.isLittleEndian(); 
    139             //System.out.println("size X Y Z T C " + sizeX + " " + sizeY + " " + sizeZ + " " + sizeT + " " + sizeC + " "); 
    140             //System.out.println("bpp " + bpp + " dim order " + dimOrder + " pixelTYpe + " + pixelType + " effsizec " + effSizeC + " littleendian " + littleEndian); 
    141  
    142             System.out.println(icsReader.getFormat()); 
     123            boolean interleaved = icsReader.isInterleaved(); 
    143124            int bins = icsReader.getSizeC(); 
     125            if (1 == bins) { 
     126                // hack for lifetime ICS that reader doesn't recognize as such 
     127                bins = icsReader.getSizeZ(); 
     128            } 
    144129            results = new float[bins]; 
    145             byte bytes[] = new byte[4]; 
    146             for (int bin = 0; bin < bins; ++bin) { 
    147                 bytes = icsReader.openBytes(bin); 
    148                 //for (byte b : bytes) { 
    149                 //    System.out.print(" " + b); 
    150                 //} 
    151                 //System.out.println(); 
    152                 results[bin] = convertBytesToFloat(bytes); 
     130            byte bytes[]; 
     131            if (false || icsReader.isInterleaved()) { //TODO ARG interleaved does not read the whole thing; was 130K, now 32767 
     132                // this returns the whole thing 
     133                bytes = icsReader.openBytes(0); 
     134                System.out.println("INTERLEAVED reads # bytes: " + bytes.length); 
     135                for (int bin = 0; bin < bins; ++bin) { 
     136                    results[bin] = convertBytesToFloat(littleEndian, bitsPerPixel, bytes, bytesPerPixel * bin); 
     137                } 
     138            } 
     139            else { 
     140                for (int bin = 0; bin < bins; ++bin) { 
     141                    bytes = icsReader.openBytes(bin); 
     142                    results[bin] = convertBytesToFloat(littleEndian, bitsPerPixel, bytes, 0); 
     143                } 
    153144            } 
    154145            icsReader.close(); 
     
    238229     * Converts a little-endian four byte array to a float. 
    239230     * 
     231     * @param littleEndian byte order 
     232     * @param bitsPerPixel 
    240233     * @param bytes 
     234     * @param index 
    241235     * @return 
    242236     */ 
    243     private float convertBytesToFloat(byte[] bytes) { 
    244         int i = 0; 
    245         i |= bytes[3] & 0xff; 
    246         i <<= 8; 
    247         i |= bytes[2] & 0xff; 
    248         i <<= 8; 
    249         i |= bytes[1] & 0xff; 
    250         i <<= 8; 
    251         i |= bytes[0] & 0xff; 
    252         return Float.intBitsToFloat(i); 
     237    private float convertBytesToFloat(boolean littleEndian, int bitsPerPixel, byte[] bytes, int index) { 
     238        float returnValue = 0.0f; 
     239        if (32 == bitsPerPixel) { 
     240            int i = 0; 
     241            if (littleEndian) { 
     242                i |= bytes[index + 3] & 0xff; 
     243                i <<= 8; 
     244                i |= bytes[index + 2] & 0xff; 
     245                i <<= 8; 
     246                i |= bytes[index + 1] & 0xff; 
     247                i <<= 8; 
     248                i |= bytes[index + 0] & 0xff; 
     249            } 
     250            else { 
     251                i |= bytes[index + 0] & 0xff; 
     252                i <<= 8; 
     253                i |= bytes[index + 1] & 0xff; 
     254                i <<= 8; 
     255                i |= bytes[index + 2] & 0xff; 
     256                i <<= 8; 
     257                i |= bytes[index + 3] & 0xff; 
     258            } 
     259            returnValue = Float.intBitsToFloat(i); 
     260        } 
     261        else if (64 == bitsPerPixel) { 
     262            long l = 0; 
     263            if (littleEndian) { 
     264                l |= bytes[index + 7] & 0xff; 
     265                l <<= 8; 
     266                l |= bytes[index + 6] & 0xff; 
     267                l <<= 8; 
     268                l |= bytes[index + 5] & 0xff; 
     269                l <<= 8; 
     270                l |= bytes[index + 4] & 0xff; 
     271                l <<= 8; 
     272                l |= bytes[index + 3] & 0xff; 
     273                l <<= 8; 
     274                l |= bytes[index + 2] & 0xff; 
     275                l <<= 8; 
     276                l |= bytes[index + 1] & 0xff; 
     277                l <<= 8; 
     278                l |= bytes[index + 0] & 0xff; 
     279            } 
     280            else { 
     281                l |= bytes[index + 0] & 0xff; 
     282                l <<= 8; 
     283                l |= bytes[index + 1] & 0xff; 
     284                l <<= 8; 
     285                l |= bytes[index + 2] & 0xff; 
     286                l <<= 8; 
     287                l |= bytes[index + 3] & 0xff; 
     288                l <<= 8; 
     289                l |= bytes[index + 4] & 0xff; 
     290                l <<= 8; 
     291                l |= bytes[index + 5] & 0xff; 
     292                l <<= 8; 
     293                l |= bytes[index + 6] & 0xff; 
     294                l <<= 8; 
     295                l |= bytes[index + 7] & 0xff; 
     296            } 
     297            returnValue = (float) Double.longBitsToDouble(l); 
     298        } 
     299        return returnValue; 
    253300    } 
    254301} 
Note: See TracChangeset for help on using the changeset viewer.