std::unique_ptr WsiToDcm::getSlideLevelDim()

in src/wsiToDcm.cpp [310:454]


std::unique_ptr<SlideLevelDim> WsiToDcm::getSlideLevelDim(int64_t downsample,
SlideLevelDim *priorLevel) {
  int32_t levelToGet;
  bool readOpenslide = false;
  std::string sourceDerivationDescription = "";
  /*
     DICOM requires uniform pixel spacing across downsampled image
     for pixel spacing based metrics to produce images with compatiable
     coordinate systems across zoom levels.

     Downsampled acquistions can have in image dimensions which are
     non-interger multiples of the highest magnification. Example: Aperio svs
     imaging, E.g. (40x -> 10x reports the 10x image has having a
     downsampling  factor of 4.00018818010427. This results in non-uniform
     scaling of the pixels and can result in small, but signifcant
     mis-alignment in the downsampled imageing. Flooring, the multiplier
     returned by openslide_get_level_downsample corrects this by restoring
     consistent downsamping and pixel spacing across the image.
  */
  std::unique_ptr<SlideLevelDim> slideLevelDim;
  slideLevelDim = std::make_unique<SlideLevelDim>();
  double multiplicator, downsampleOfLevel;
  int64_t sourceLevelWidth, sourceLevelHeight;
  bool generateFromPrimarySource = true;
  bool readFromTiff = false;
  if ((tiffFile_ != nullptr && tiffFile_->isInitalized()) &&
      ((downsample == 1 &&
        wsiRequest_->SVSImportPreferScannerTileingForLargestLevel) ||
        wsiRequest_->SVSImportPreferScannerTileingForAllLevels)) {
    sourceLevelWidth = largestSlideLevelWidth_ / downsample;
    sourceLevelHeight = largestSlideLevelHeight_ / downsample;
    levelToGet = tiffFile_->getDirectoryIndexMatchingImageDimensions(
                              sourceLevelWidth, sourceLevelHeight);
    if (levelToGet != -1) {
      multiplicator = static_cast<double>(downsample);
      downsampleOfLevel = 1.0;
      generateFromPrimarySource = false;
      readFromTiff = true;
      // Source component of DCM_DerivationDescription
      // describes in text where imaging data was acquired from.
      sourceDerivationDescription =
                    std::string("Image frame/tiles extracted without "
                    "decompression from ") + tiffFile_->path() +
                    ", file level: " + std::to_string(levelToGet) + ", and ";
    }
  }
  // ProgressiveDownsampling
  if (!readFromTiff && wsiRequest_->preferProgressiveDownsampling &&
      priorLevel != nullptr) {
    multiplicator = static_cast<double>(priorLevel->downsample);
    downsampleOfLevel = static_cast<double>(downsample) / multiplicator;
    // check that downsampling is going from higher to lower magnification
    if (downsampleOfLevel >= 1.0) {
      // Progressive downsampling, level to get not used. Init to -1.
      levelToGet = -1;
      sourceLevelWidth = priorLevel->downsampledLevelWidth;
      sourceLevelHeight = priorLevel->downsampledLevelHeight;
      generateFromPrimarySource = false;
      // Source component of DCM_DerivationDescription
      // describes in text where imaging data was acquired from.
      if (priorLevel->useSourceDerivationDescriptionForDerivedImage) {
        sourceDerivationDescription = priorLevel->sourceDerivationDescription;
      } else if (downsampleOfLevel > 1.0) {
        sourceDerivationDescription =
          std::string("Image frame/tiles generated by downsampling, ") +
          std::to_string(downsampleOfLevel) + " times; "
          "raw pixel values extracted from previous image level and ";
      } else {
        sourceDerivationDescription =
          std::string("Image frame/tiles generated from the raw pixel values "
          "and ");
      }
    }
  }
  if (generateFromPrimarySource) {
    // if no higherMagnifcationDicomFiles then downsample from openslide
    levelToGet = getOpenslideLevelForDownsample(downsample);
    multiplicator = openslide_get_level_downsample(getOpenSlidePtr(),
                                                   levelToGet);
    // Downsampling factor required to go from selected
    // downsampled level to the desired level of downsampling
    if (wsiRequest_->floorCorrectDownsampling) {
      multiplicator = floor(multiplicator);
    }
    downsampleOfLevel = static_cast<double>(downsample) / multiplicator;
    openslide_get_level_dimensions(getOpenSlidePtr(),
                                   levelToGet,
                                   &sourceLevelWidth,
                                   &sourceLevelHeight);
    // Source component of DCM_DerivationDescription
    // describes in text where imaging data was acquired from.
    if (downsampleOfLevel > 1.0) {
       sourceDerivationDescription =
          std::string("Image frame/tiles generated by downsampling, ") +
          std::to_string(downsampleOfLevel) + " times, "
          "pixel values extracted via OpenSlide(file: " +
          wsiRequest_->inputFile + ", level: " +
          std::to_string(levelToGet) + ") and ";
    } else {
      sourceDerivationDescription =
        std::string("Image frame/tiles generated from "
        "pixel values extracted via OpenSlide(file: ") +
        wsiRequest_->inputFile + ", level: " +
        std::to_string(levelToGet) + ") and ";
    }
    readOpenslide = true;
  }
  // Adjust level size by starting position if skipping row and column.
  // downsampledLevelHeight and downsampledLevelWidth will reflect
  // new starting position.
  int64_t downsampledLevelWidth, downsampledLevelHeight;
  int64_t downsampledLevelFrameWidth, downsampledLevelFrameHeight;
  DCM_Compression levelCompression;
  if (downsample <= 1) {
    levelCompression = wsiRequest_->firstlevelCompression;
  } else {
    levelCompression = wsiRequest_->compression;
  }
  sourceLevelWidth -= initialX_;
  sourceLevelHeight -= initialY_;
  dimensionDownsampling(wsiRequest_->frameSizeX, wsiRequest_->frameSizeY,
                        sourceLevelWidth, sourceLevelHeight,
                        retile_, downsampleOfLevel,
                        &downsampledLevelWidth,
                        &downsampledLevelHeight,
                        &downsampledLevelFrameWidth,
                        &downsampledLevelFrameHeight);
  slideLevelDim->readFromTiff = readFromTiff;
  slideLevelDim->levelToGet = levelToGet;
  slideLevelDim->downsample = downsample;
  slideLevelDim->multiplicator = multiplicator;
  slideLevelDim->downsampleOfLevel = downsampleOfLevel;
  slideLevelDim->sourceLevelWidth = sourceLevelWidth;
  slideLevelDim->sourceLevelHeight = sourceLevelHeight;
  slideLevelDim->downsampledLevelWidth = downsampledLevelWidth;
  slideLevelDim->downsampledLevelHeight = downsampledLevelHeight;
  slideLevelDim->downsampledLevelFrameWidth = downsampledLevelFrameWidth;
  slideLevelDim->downsampledLevelFrameHeight = downsampledLevelFrameHeight;
  slideLevelDim->levelCompression = levelCompression;
  slideLevelDim->readOpenslide = readOpenslide;
  slideLevelDim->sourceDerivationDescription =
                                  std::move(sourceDerivationDescription);
  slideLevelDim->useSourceDerivationDescriptionForDerivedImage = false;
  return (std::move(slideLevelDim));
}