From 731c597efa61a57faa38d2e31ec55c057057d1a0 Mon Sep 17 00:00:00 2001 From: Alexander Serdyukov Date: Wed, 17 Jun 2026 16:18:09 +0400 Subject: [PATCH] Add HiCT/Cooler export/import options --- src/app/core/net/api/request.ts | 5 ++ src/app/core/net/dto/requestDTO.ts | 5 ++ .../upper_ribbon/FileWizardModal.vue | 30 ++++++++- .../upper_ribbon/MatrixExportModal.vue | 65 ++++++++++++++++++- 4 files changed, 100 insertions(+), 5 deletions(-) diff --git a/src/app/core/net/api/request.ts b/src/app/core/net/api/request.ts index cc35c46..7b1c6c2 100644 --- a/src/app/core/net/api/request.ts +++ b/src/app/core/net/api/request.ts @@ -196,6 +196,7 @@ class StartConversionJobRequest implements HiCTAPIRequest { readonly assemblyFilename?: string; readonly useCurrentAssembly?: boolean; readonly direction?: string; + readonly outputFilename?: string; readonly overwrite?: boolean; readonly resolutions?: string; readonly compression?: number; @@ -205,6 +206,8 @@ class StartConversionJobRequest implements HiCTAPIRequest { readonly exportMode?: string; readonly exportAllResolutions?: boolean; readonly buildResolutionPyramid?: boolean; + readonly balanceInputCoolers?: boolean; + readonly balanceExportedCoolers?: boolean; readonly binTableFilename?: string; readonly chromSizesFilename?: string; readonly binSize?: number; @@ -232,6 +235,8 @@ class StartBatchConversionJobsRequest implements HiCTAPIRequest { readonly exportMode?: string; readonly exportAllResolutions?: boolean; readonly buildResolutionPyramid?: boolean; + readonly balanceInputCoolers?: boolean; + readonly balanceExportedCoolers?: boolean; readonly binTableFilename?: string; readonly chromSizesFilename?: string; readonly binSize?: number; diff --git a/src/app/core/net/dto/requestDTO.ts b/src/app/core/net/dto/requestDTO.ts index 993ae15..cdaba32 100644 --- a/src/app/core/net/dto/requestDTO.ts +++ b/src/app/core/net/dto/requestDTO.ts @@ -505,6 +505,7 @@ class StartConversionJobRequestDTO extends HiCTAPIRequestDTO -
+
- Enabled by default. HiCT will zoomify and balance converted Cooler inputs before import so sparse or single-resolution files open with a complete set of map resolutions. + Enabled by default. HiCT will zoomify converted Cooler inputs before import so sparse or single-resolution files open with a complete set of map resolutions. +
+
+
+ + +
+ Enabled by default for .cool/.mcool inputs. HiCT will run hictk ICE balancing before importing so Cooler weights are available immediately.
@@ -913,6 +922,7 @@ const precomputeTracks = ref(true); const forceTrackPrecompute = ref(false); const dropCachesBeforeRun = ref(false); const buildResolutionPyramid = ref(true); +const balanceInputCoolers = ref(true); const blendMode = ref("OVER"); const topOpacity = ref(0.5); const bottomOpacity = ref(1.0); @@ -1353,6 +1363,16 @@ const isOpenableAssemblyFilename = (name: string): boolean => { ); }; +const isCoolerFilename = (name: string): boolean => { + const lowered = name.toLowerCase(); + return lowered.endsWith(".cool") || lowered.endsWith(".mcool"); +}; + +const hasSelectedCoolerSource = computed(() => + isCoolerFilename(primarySource.filename) || + (requiresSecondarySource.value && isCoolerFilename(secondarySource.filename)) +); + const stripCompressionSuffix = (name: string): string => name.replace(/\.(gz|bgz|xz|zst|zstd|bz2|lz4|lzo)$/i, ""); @@ -1749,8 +1769,13 @@ const ensureOpenedFilename = async (source: SourceDraft): Promise => { if (!resolution) { throw new Error(`Failed to resolve source ${source.filename}`); } + const forceCoolerPreparation = + isCoolerFilename(source.filename) && + canConvertSource(source) && + (buildResolutionPyramid.value || balanceInputCoolers.value); if ( (!(source.forceConversion && canConvertSource(source))) && + !forceCoolerPreparation && (resolution.action === "OPEN_DIRECT" || resolution.action === "REUSE_CONVERTED") ) { return resolution.resolvedFilename; @@ -1770,6 +1795,7 @@ const ensureOpenedFilename = async (source: SourceDraft): Promise => { binSize: source.binSize ?? undefined, countAsFloat: source.countAsFloat || undefined, buildResolutionPyramid: buildResolutionPyramid.value, + balanceInputCoolers: balanceInputCoolers.value, }) ); const finishedJob = await waitForConversionJob(started.jobId); diff --git a/src/app/ui/components/upper_ribbon/MatrixExportModal.vue b/src/app/ui/components/upper_ribbon/MatrixExportModal.vue index c7274de..51d3579 100644 --- a/src/app/ui/components/upper_ribbon/MatrixExportModal.vue +++ b/src/app/ui/components/upper_ribbon/MatrixExportModal.vue @@ -25,7 +25,7 @@