Changeset 3505


Ignore:
Timestamp:
12/28/07 10:50:45 (12 years ago)
Author:
melissa
Message:

Greatly improved axis size calculation logic.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/loci/formats/in/SlidebookReader.java

    r3367 r3505  
    203203    int hCount = 0; 
    204204    int uCount = 0; 
     205    int prevSeries = -1; 
     206    int prevSeriesU = -1; 
    205207    for (int i=0; i<metadataOffsets.size(); i++) { 
    206208      long off = ((Long) metadataOffsets.get(i)).longValue(); 
     
    208210      int n = in.read(); 
    209211      if (n == 'i') { 
    210         in.skipBytes(79); 
    211         core.sizeX[0] = in.readShort(); 
    212         core.sizeY[0] = in.readShort(); 
    213212        iCount++; 
     213        in.skipBytes(81); 
     214        for (int j=1; j<pixelOffsets.size(); j++) { 
     215          if ((in.getFilePointer() < 
     216            ((Long) pixelOffsets.get(j)).longValue()) || 
     217            (j == pixelOffsets.size() - 1)) 
     218          { 
     219            core.sizeY[j - 1] = in.readShort(); 
     220            if (prevSeries != j - 1) { 
     221              iCount = 1; 
     222            } 
     223            prevSeries = j - 1; 
     224            core.sizeC[j - 1] = iCount; 
     225            break; 
     226          } 
     227        } 
     228      } 
     229      else if (n == 'u') { 
     230        uCount++; 
     231        for (int j=1; j<pixelOffsets.size(); j++) { 
     232          if ((in.getFilePointer() < 
     233            ((Long) pixelOffsets.get(j)).longValue()) || 
     234            (j == pixelOffsets.size() - 1)) 
     235          { 
     236            if (prevSeriesU != j - 1) { 
     237              uCount = 1; 
     238            } 
     239            prevSeriesU = j - 1; 
     240            core.sizeT[j - 1] = uCount; 
     241            break; 
     242          } 
     243        } 
    214244      } 
    215245      else if (n == 'h') hCount++; 
    216       else if (n == 'u') uCount++; 
    217     } 
    218  
    219     core.rgb[0] = false; 
    220     core.sizeC[0] = iCount; 
    221     if (core.sizeX[0] * core.sizeY[0] * 2 * (uCount + hCount - 1) >= 
    222       in.length()) 
    223     { 
    224       core.sizeC[0] = 1; 
    225     } 
    226  
    227     if (core.sizeC[0] == 0) core.sizeC[0] = 1; 
    228     if (core.sizeZ[0] == 0) core.sizeZ[0] = 1; 
    229     if (core.sizeT[0] == 0) core.sizeT[0] = 1; 
    230  
    231     if (core.sizeX[0] * core.sizeY[0] * 2 * core.sizeC[0] * 
    232       core.sizeZ[0] * core.sizeT[0] != pixelBytes && hCount > 0) 
    233     { 
    234       core.sizeZ[0] = hCount / core.sizeC[0]; 
    235     } 
    236  
    237     int n = core.sizeZ[0] * core.sizeC[0] * core.sizeT[0]; 
    238  
    239     if (uCount == core.sizeZ[0] * core.sizeT[0]) uCount = n; 
    240     if (uCount < core.sizeZ[0] * core.sizeT[0] * core.sizeC[0]) { 
    241       int planesPerMontage = (n * 2) / uCount; 
    242  
    243       while (planesPerMontage > 1) { 
    244         core.sizeY[0] /= 2; 
    245         planesPerMontage /= 2; 
    246         if (planesPerMontage > 1) { 
    247           core.sizeX[0] /= 2; 
    248           planesPerMontage /= 2; 
    249         } 
    250       } 
    251       if (core.sizeC[0] == 1) core.sizeC[0] = 2; 
    252       else core.sizeT[0] *= 2; 
    253     } 
    254     else if (uCount > core.sizeZ[0] * core.sizeT[0] * core.sizeC[0]) { 
    255       int planesPerMontage = 
    256         (int) ((core.sizeX[0] * core.sizeY[0] * 2) / (pixelBytes / uCount)); 
    257       if (planesPerMontage % 2 != 0) planesPerMontage++; 
    258       if (planesPerMontage == 2) planesPerMontage += 2; 
    259       if (planesPerMontage == 0) planesPerMontage++; 
    260  
    261       int plane = core.sizeX[0] * core.sizeY[0]; 
    262       while (uCount * core.sizeC[0] * (plane*2 / planesPerMontage) < 
    263         (pixelBytes - plane)) 
    264       { 
    265         uCount++; 
    266       } 
    267  
    268       while (planesPerMontage > 1 && 
    269         core.sizeX[0] * core.sizeY[0] * 2 * uCount > pixelBytes) 
    270       { 
    271         core.sizeY[0] /= 2; 
    272         planesPerMontage /= 2; 
    273         if (planesPerMontage > 1 && 
    274           core.sizeX[0] * core.sizeY[0] * 2 * uCount > pixelBytes) 
    275         { 
    276           core.sizeX[0] /= 2; 
    277           planesPerMontage /= 2; 
    278         } 
    279         else planesPerMontage = 1; 
    280       } 
    281       core.sizeZ[0] = uCount; 
    282     } 
    283  
    284     // couldn't find the dimensions; these are reasonable guesses 
    285     if (core.sizeX[0] == 0) core.sizeX[0] = 512; 
    286     if (core.sizeY[0] == 0) core.sizeY[0] = 512; 
     246    } 
    287247 
    288248    for (int i=0; i<core.sizeX.length; i++) { 
    289       core.sizeX[i] = core.sizeX[0]; 
    290       core.sizeY[i] = core.sizeY[0]; 
    291       core.currentOrder[i] = "XYZCT"; 
     249      long pixels = ((Long) pixelLengths.get(i)).longValue() / 2; 
     250      core.sizeZ[i] = 1; 
     251      core.imageCount[i] = core.sizeZ[i] * core.sizeT[i] * core.sizeC[i]; 
     252      core.sizeX[i] = (int) (pixels / (core.imageCount[i] * core.sizeY[i])); 
    292253      core.pixelType[i] = FormatTools.UINT16; 
     254      core.currentOrder[i] = "XYZTC"; 
    293255      core.littleEndian[i] = true; 
    294  
    295       core.sizeC[i] = core.sizeC[0]; 
    296       core.sizeT[i] = core.sizeT[0]; 
    297       long len = ((Long) pixelLengths.get(i)).longValue(); 
    298       core.sizeZ[i] = 
    299         (int) (len / (core.sizeX[i] * core.sizeY[i] * 2 * core.sizeC[i])); 
    300  
    301       if (core.sizeZ[i] == 0) core.sizeZ[i] = 1; 
    302       if (core.sizeT[i] == 0) core.sizeT[i] = 1; 
    303       if (core.sizeC[i] == 0) core.sizeC[i] = 1; 
    304  
    305       core.imageCount[i] = core.sizeC[i] * core.sizeZ[i] * core.sizeT[i]; 
    306  
    307256      core.indexed[i] = false; 
    308257      core.falseColor[i] = false; 
Note: See TracChangeset for help on using the changeset viewer.