private ForDeprecatedConstructors(
        final AbstractSpimData<?> spimData,
        final String windowTitle,
        final ProgressWriter progressWriter) {
      this.windowTitle = windowTitle;
      this.progressWriter = progressWriter;
      this.spimData = spimData;

      windowWidth = 800;
      windowHeight = 600;

      if (WrapBasicImgLoader.wrapImgLoaderIfNecessary(spimData)) {
        System.err.println(
            "WARNING:\nOpening <SpimData> dataset that is not suited for interactive browsing.\nConsider resaving as HDF5 for better performance.");
      }

      converterSetups = new ArrayList<ConverterSetup>();
      sources = new ArrayList<SourceAndConverter<?>>();
      initSetups(spimData, converterSetups, sources);

      final AbstractSequenceDescription<?, ?, ?> seq = spimData.getSequenceDescription();
      numTimepoints = seq.getTimePoints().size();
      cache = ((ViewerImgLoader<?, ?>) seq.getImgLoader()).getCache();

      WrapBasicImgLoader.removeWrapperIfPresent(spimData);
    }
  private static void initSetupsARGBType(
      final AbstractSpimData<?> spimData,
      final ARGBType type,
      final List<ConverterSetup> converterSetups,
      final List<SourceAndConverter<?>> sources) {
    if (spimData.getSequenceDescription().getImgLoader() instanceof WrapBasicImgLoader) {
      initSetupsARGBTypeNonVolatile(spimData, type, converterSetups, sources);
      return;
    }
    final AbstractSequenceDescription<?, ?, ?> seq = spimData.getSequenceDescription();
    for (final BasicViewSetup setup : seq.getViewSetupsOrdered()) {
      final ScaledARGBConverter.VolatileARGB vconverter =
          new ScaledARGBConverter.VolatileARGB(0, 255);
      final ScaledARGBConverter.ARGB converter = new ScaledARGBConverter.ARGB(0, 255);

      final int setupId = setup.getId();
      final String setupName = createSetupName(setup);
      final VolatileSpimSource<ARGBType, VolatileARGBType> vs =
          new VolatileSpimSource<ARGBType, VolatileARGBType>(spimData, setupId, setupName);
      final SpimSource<ARGBType> s = vs.nonVolatile();

      // Decorate each source with an extra transformation, that can be
      // edited manually in this viewer.
      final TransformedSource<VolatileARGBType> tvs = new TransformedSource<VolatileARGBType>(vs);
      final TransformedSource<ARGBType> ts = new TransformedSource<ARGBType>(s, tvs);

      final SourceAndConverter<VolatileARGBType> vsoc =
          new SourceAndConverter<VolatileARGBType>(tvs, vconverter);
      final SourceAndConverter<ARGBType> soc =
          new SourceAndConverter<ARGBType>(ts, converter, vsoc);

      sources.add(soc);
      converterSetups.add(new RealARGBColorConverterSetup(setupId, converter, vconverter));
    }
  }
  private static <T extends RealType<T>> void initSetupsRealTypeNonVolatile(
      final AbstractSpimData<?> spimData,
      final T type,
      final List<ConverterSetup> converterSetups,
      final List<SourceAndConverter<?>> sources) {
    final double typeMin = type.getMinValue();
    final double typeMax = type.getMaxValue();
    final AbstractSequenceDescription<?, ?, ?> seq = spimData.getSequenceDescription();
    for (final BasicViewSetup setup : seq.getViewSetupsOrdered()) {
      final RealARGBColorConverter<T> converter =
          new RealARGBColorConverter.Imp1<T>(typeMin, typeMax);
      converter.setColor(new ARGBType(0xffffffff));

      final int setupId = setup.getId();
      final String setupName = createSetupName(setup);
      final SpimSource<T> s = new SpimSource<T>(spimData, setupId, setupName);

      // Decorate each source with an extra transformation, that can be
      // edited manually in this viewer.
      final TransformedSource<T> ts = new TransformedSource<T>(s);
      final SourceAndConverter<T> soc = new SourceAndConverter<T>(ts, converter);

      sources.add(soc);
      converterSetups.add(new RealARGBColorConverterSetup(setupId, converter));
    }
  }
 @SuppressWarnings("unchecked")
 public SpimSource(final AbstractSpimData<?> spimData, final int setup, final String name) {
   super(spimData, setup, name);
   final AbstractSequenceDescription<?, ?, ?> seq = spimData.getSequenceDescription();
   imgLoader = (ViewerImgLoader<T, ?>) seq.getImgLoader();
   loadTimepoint(0);
 }
  private static <T extends RealType<T>, V extends Volatile<T> & RealType<V>>
      void initSetupsRealType(
          final AbstractSpimData<?> spimData,
          final T type,
          final List<ConverterSetup> converterSetups,
          final List<SourceAndConverter<?>> sources) {
    if (spimData.getSequenceDescription().getImgLoader() instanceof WrapBasicImgLoader) {
      initSetupsRealTypeNonVolatile(spimData, type, converterSetups, sources);
      return;
    }
    final double typeMin = Math.max(0, Math.min(type.getMinValue(), 65535));
    final double typeMax = Math.max(0, Math.min(type.getMaxValue(), 65535));
    final AbstractSequenceDescription<?, ?, ?> seq = spimData.getSequenceDescription();
    for (final BasicViewSetup setup : seq.getViewSetupsOrdered()) {
      final RealARGBColorConverter<V> vconverter =
          new RealARGBColorConverter.Imp0<V>(typeMin, typeMax);
      vconverter.setColor(new ARGBType(0xffffffff));
      final RealARGBColorConverter<T> converter =
          new RealARGBColorConverter.Imp1<T>(typeMin, typeMax);
      converter.setColor(new ARGBType(0xffffffff));

      final int setupId = setup.getId();
      final String setupName = createSetupName(setup);
      final VolatileSpimSource<T, V> vs =
          new VolatileSpimSource<T, V>(spimData, setupId, setupName);
      final SpimSource<T> s = vs.nonVolatile();

      // Decorate each source with an extra transformation, that can be
      // edited manually in this viewer.
      final TransformedSource<V> tvs = new TransformedSource<V>(vs);
      final TransformedSource<T> ts = new TransformedSource<T>(s, tvs);

      final SourceAndConverter<V> vsoc = new SourceAndConverter<V>(tvs, vconverter);
      final SourceAndConverter<T> soc = new SourceAndConverter<T>(ts, converter, vsoc);

      sources.add(soc);
      converterSetups.add(new RealARGBColorConverterSetup(setupId, converter, vconverter));
    }
  }
  public static BigDataViewer open(
      final AbstractSpimData<?> spimData,
      final String windowTitle,
      final ProgressWriter progressWriter) {
    final int width = 800;
    final int height = 600;

    if (WrapBasicImgLoader.wrapImgLoaderIfNecessary(spimData)) {
      System.err.println(
          "WARNING:\nOpening <SpimData> dataset that is not suited for interactive browsing.\nConsider resaving as HDF5 for better performance.");
    }

    final ArrayList<ConverterSetup> converterSetups = new ArrayList<ConverterSetup>();
    final ArrayList<SourceAndConverter<?>> sources = new ArrayList<SourceAndConverter<?>>();
    initSetups(spimData, converterSetups, sources);

    final AbstractSequenceDescription<?, ?, ?> seq = spimData.getSequenceDescription();
    final int numTimepoints = seq.getTimePoints().size();
    final Cache cache = ((ViewerImgLoader<?, ?>) seq.getImgLoader()).getCache();

    final BigDataViewer bdv =
        new BigDataViewer(
            converterSetups,
            sources,
            spimData,
            numTimepoints,
            cache,
            windowTitle,
            width,
            height,
            progressWriter);

    WrapBasicImgLoader.removeWrapperIfPresent(spimData);

    bdv.viewerFrame.setVisible(true);
    InitializeViewerState.initTransform(bdv.viewer);
    return bdv;
  }