private computeLevel()

in pathology/viewer/src/services/slide-api.service.ts [55:121]


  private computeLevel(dicomModel: DicomModel, isFlatImage: boolean): Level {
    let frames =
      dicomModel[DicomTag.NUMBER_OF_FRAMES]?.Value?.[0] as number;
    let height = Number(
      dicomModel?.[DicomTag.TOTAL_PIXEL_MATRIX_ROWS]?.Value ?? NaN);
    let width = Number(
      dicomModel?.[DicomTag.TOTAL_PIXEL_MATRIX_COLUMNS]?.Value ?? NaN);


    const tileSize = Math.max(
      Number(dicomModel?.[DicomTag.ROWS]?.Value?.[0] ?? undefined),
      Number(dicomModel?.[DicomTag.COLS]?.Value?.[0] ?? undefined));
    const instanceUid =
      dicomModel[DicomTag.SOP_INSTANCE_UID]?.Value?.[0] as string;
    const offset = (dicomModel[DicomTag.OFFSET]?.Value?.[0] ?? 0) as number;
    const physicalWidthMillimeters =
      Number(dicomModel[DicomTag.IMAGE_VOLUME_WIDTH]?.Value ?? NaN);
    const physicalHeightMillimeters =
      Number(dicomModel[DicomTag.IMAGE_VOLUME_HEIGHT]?.Value ?? NaN);
    let pixelWidth: number | undefined = physicalWidthMillimeters / width;
    let pixelHeight: number | undefined = physicalHeightMillimeters / height;
    if ((!Number.isFinite(pixelWidth) || !Number.isFinite(pixelHeight)) &&
      dicomModel[DicomTag.PIXEL_SPACING]?.Value?.length === 2) {
      const ps = dicomModel[DicomTag.PIXEL_SPACING].Value;
      pixelWidth = Number(ps[0]);
      pixelHeight = Number(ps[1]);
    }
    pixelWidth =
      !pixelWidth || !Number.isFinite(pixelWidth) ? undefined : pixelWidth;
    pixelHeight =
      !pixelHeight || !Number.isFinite(pixelHeight) ? undefined : pixelHeight;

    if (isFlatImage) {
      frames = 1;
      height = Number(dicomModel?.[DicomTag.ROWS]?.Value?.[0] ?? undefined);
      width = Number(dicomModel?.[DicomTag.COLS]?.Value?.[0] ?? undefined);
    }

    // ⌈NumberOfFrames * tile width * tile height * Samples Per Pixel *
    // ⌈Allocated Bits Stored / 8⌉ / LossImageCompressionRatio⌉
    const storedBytes = Math.ceil(
      Number(dicomModel?.[DicomTag.ROWS]?.Value?.[0] ?? NaN) *
      Number(dicomModel?.[DicomTag.COLS]?.Value?.[0] ?? NaN) * frames *
      Number(dicomModel?.[DicomTag.SAMPLES_PER_PIXEL]?.Value?.[0] ?? NaN) *
      Math.ceil(
        Number(dicomModel?.[DicomTag.BITS_ALLOCATED]?.Value?.[0] ?? NaN) /
        8) /
      Number(
        dicomModel?.[DicomTag.LOSSY_IMAGE_COMPRESSION_RATIO]?.Value?.[0] ??
        1 /* uncompressed */));

    return {
      properties: [{
        offset,
        frames,
        instanceUid,
      }],
      width,
      height,
      pixelWidth,
      pixelHeight,
      tileSize,
      zoom: 0,  // unknown at this point
      storedBytes,
      dicomModel,
    };
  }