Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add frontend and backend part for job to materialize a volume annotation #6086

Merged
merged 39 commits into from
May 9, 2022
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
435f2f1
add frontend and backend part for job to apply merger mode tracing
MichaelBuessemeyer Feb 28, 2022
ee1f591
renaming variable
MichaelBuessemeyer Feb 28, 2022
4f7dcb0
Merge branch 'master' of github.com:scalableminds/webknossos into add…
MichaelBuessemeyer Mar 21, 2022
db2998a
add annotation type as job parameter and make layer names more readable
MichaelBuessemeyer Mar 21, 2022
719a98a
fix layer selection for merger mode job modal
MichaelBuessemeyer Mar 22, 2022
c2190cd
add job output dataset name to start job modals
MichaelBuessemeyer Mar 31, 2022
a9fb85e
add output dataset name to nuclei & neuron & merger mode job params
MichaelBuessemeyer Mar 31, 2022
7f045f5
Merge branch 'master' of github.com:scalableminds/webknossos into add…
MichaelBuessemeyer Mar 31, 2022
d0be7b9
refactor starting modal for flood fills to use the same root componen…
MichaelBuessemeyer Mar 31, 2022
60a5acf
Merge branch 'master' into add-apply-merger-mode-job
MichaelBuessemeyer Apr 4, 2022
c252d40
Apply suggestions from code review
MichaelBuessemeyer Apr 5, 2022
7512f3a
Merge branch 'master' of github.com:scalableminds/webknossos into add…
MichaelBuessemeyer Apr 5, 2022
0aa7e31
apply pr feedback
MichaelBuessemeyer Apr 5, 2022
9d16876
Merge branch 'add-apply-merger-mode-job' of github.com:scalableminds/…
MichaelBuessemeyer Apr 5, 2022
7688824
disable jobs
MichaelBuessemeyer Apr 5, 2022
28a66f9
update docs
MichaelBuessemeyer Apr 25, 2022
b81be12
apply pr feedback
MichaelBuessemeyer Apr 25, 2022
77d6e32
Merge branch 'master' of github.com:scalableminds/webknossos into add…
MichaelBuessemeyer Apr 25, 2022
cd5d318
add changelog entry
MichaelBuessemeyer Apr 25, 2022
485c2d3
Update docs/volume_annotation.md
MichaelBuessemeyer Apr 27, 2022
7601d6f
only show merger mode job button whe jobs are enabled
MichaelBuessemeyer Apr 27, 2022
ef24b0a
Merge branch 'master' into add-apply-merger-mode-job
MichaelBuessemeyer Apr 27, 2022
5d3a7e9
add output segmentation layer name as user input field to apply merge…
MichaelBuessemeyer Apr 28, 2022
04e4f96
add segmentation output layer name to apply merger mode job api call
MichaelBuessemeyer May 2, 2022
2d740f7
Merge branch 'master' of github.com:scalableminds/webknossos into add…
MichaelBuessemeyer May 2, 2022
740efd6
make merger job available for volume annotation without skeletons
MichaelBuessemeyer May 4, 2022
4ec2dc9
Merge branch 'master' of github.com:scalableminds/webknossos into add…
MichaelBuessemeyer May 4, 2022
a810b43
fix returnLink of materialize job
MichaelBuessemeyer May 5, 2022
0bbbe0d
make materialize volume anotation job better compatible with volume …
MichaelBuessemeyer May 5, 2022
310375f
update doc images and add merge with fallback layer section to docs
MichaelBuessemeyer May 5, 2022
9f6a3e7
Apply suggestions from code review
MichaelBuessemeyer May 5, 2022
c02083c
apply review feedback
MichaelBuessemeyer May 5, 2022
edff465
Merge branch 'master' into add-apply-merger-mode-job
fm3 May 9, 2022
b43250b
Update docs/volume_annotation.md
MichaelBuessemeyer May 9, 2022
4d9ca99
Merge branch 'master' into add-apply-merger-mode-job
MichaelBuessemeyer May 9, 2022
4af34cf
apply pr feedback
MichaelBuessemeyer May 9, 2022
dad50a8
Merge branch 'master' of github.com:scalableminds/webknossos into add…
MichaelBuessemeyer May 9, 2022
b581c4b
Merge branch 'add-apply-merger-mode-job' of github.com:scalableminds/…
MichaelBuessemeyer May 9, 2022
89bb93f
rephrase commennt to make it clearer
MichaelBuessemeyer May 9, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.unreleased.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ For upgrade instructions, please check the [migration guide](MIGRATIONS.released

### Added
- Added a long-running job that applies the merging done via a merger mode tracing to a new output dataset. The job is accessible via a button next to the merger mode button once the merger mode is active. [#6086](https://github.com/scalableminds/webknossos/pull/6086)
- Added support to stream zarr files using the corresponding [zarr spec](https://zarr.readthedocs.io/en/stable/spec/v2.html#storage). [#6144](https://github.com/scalableminds/webknossos/pull/6144)

### Changed

Expand Down
20 changes: 11 additions & 9 deletions app/controllers/JobsController.scala
Original file line number Diff line number Diff line change
Expand Up @@ -267,14 +267,15 @@ class JobsController @Inject()(jobDAO: JobDAO,
}
}

def runApplyMergerModeJob(organizationName: String,
dataSetName: String,
fallbackLayerName: String,
annotationId: String,
annotationType: String,
newDatasetName: String,
outputSegmentationLayerName: String,
volumeLayerName: Option[String]): Action[AnyContent] =
def runMaterializeVolumeAnnotationJob(organizationName: String,
dataSetName: String,
fallbackLayerName: String,
annotationId: String,
annotationType: String,
newDatasetName: String,
outputSegmentationLayerName: String,
mergeSegments: Boolean,
volumeLayerName: Option[String]): Action[AnyContent] =
sil.SecuredAction.async { implicit request =>
log(Some(slackNotificationService.noticeFailedJobRequest)) {
for {
Expand All @@ -286,7 +287,7 @@ class JobsController @Inject()(jobDAO: JobDAO,
dataSetName) ~> NOT_FOUND
userAuthToken <- wkSilhouetteEnvironment.combinedAuthenticatorService.findOrCreateToken(
request.identity.loginInfo)
command = "apply_merger_mode"
command = "materialize_volume_annotation"
commandArgs = Json.obj(
"organization_name" -> organizationName,
"dataset_name" -> dataSetName,
Expand All @@ -297,6 +298,7 @@ class JobsController @Inject()(jobDAO: JobDAO,
"output_segmentation_layer_name" -> outputSegmentationLayerName,
"annotation_type" -> annotationType,
"new_dataset_name" -> newDatasetName,
"merge_segments" -> mergeSegments,
"volume_layer_name" -> volumeLayerName
)
job <- jobService.submitJob(command, commandArgs, request.identity, dataSet._dataStore) ?~> "job.couldNotRunApplyMergerMode"
Expand Down
2 changes: 1 addition & 1 deletion app/models/job/Job.scala
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ case class Job(
}
case "export_tiff" =>
Some(s"$dataStorePublicUrl/data/exports/${_id.id}/download")
case "infer_nuclei" | "infer_neurons" | "apply_merger_mode" =>
case "infer_nuclei" | "infer_neurons" | "materialize_volume_annotation" =>
returnValue.map { resultDatasetName =>
s"/datasets/$organizationName/$resultDatasetName/view"
}
Expand Down
348 changes: 174 additions & 174 deletions conf/webknossos.latest.routes

Large diffs are not rendered by default.

11 changes: 9 additions & 2 deletions frontend/javascripts/admin/admin_rest_api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -948,6 +948,7 @@ export async function getJobs(): Promise<APIJob[]> {
tracingId: job.commandArgs.volume_tracing_id,
annotationId: job.commandArgs.annotation_id,
annotationType: job.commandArgs.annotation_type,
mergeSegments: job.commandArgs.merge_segments,
state: adaptJobState(job.command, job.state, job.manualState),
manualState: job.manualState,
result: job.returnValue,
Expand Down Expand Up @@ -1084,6 +1085,7 @@ function startSegmentationAnnotationDependentJob(
annotationId: string,
annotationType: APIAnnotationType,
outputSegmentationLayerName?: string,
mergeSegments?: boolean,
): Promise<APIJob> {
const requestURL = new URL(
`/api/jobs/run/${jobURLPath}/${organizationName}/${datasetName}`,
Expand All @@ -1100,6 +1102,9 @@ function startSegmentationAnnotationDependentJob(
if (outputSegmentationLayerName != null) {
requestURL.searchParams.append("outputSegmentationLayerName", outputSegmentationLayerName);
}
if (mergeSegments != null) {
requestURL.searchParams.append("mergeSegments", mergeSegments.toString());
}
return Request.receiveJSON(requestURL.href, {
method: "POST",
});
Expand All @@ -1126,7 +1131,7 @@ export function startGlobalizeFloodfillsJob(
);
}

export function startApplyMergerModeJob(
export function startMaterializingVolumeAnnotationJob(
organizationName: string,
datasetName: string,
fallbackLayerName: string,
Expand All @@ -1135,9 +1140,10 @@ export function startApplyMergerModeJob(
outputSegmentationLayerName: string,
annotationId: string,
annotationType: APIAnnotationType,
mergeSegments: boolean,
): Promise<APIJob> {
return startSegmentationAnnotationDependentJob(
"applyMergerMode",
"materializeVolumeAnnotation",
organizationName,
datasetName,
fallbackLayerName,
Expand All @@ -1146,6 +1152,7 @@ export function startApplyMergerModeJob(
annotationId,
annotationType,
outputSegmentationLayerName,
mergeSegments,
);
}

Expand Down
14 changes: 8 additions & 6 deletions frontend/javascripts/admin/job/job_list_view.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -175,17 +175,19 @@ class JobListView extends React.PureComponent<Props, State> {
</span>
);
} else if (
job.type === "apply_merger_mode" &&
job.type === "materialize_volume_annotation" &&
job.organizationName &&
job.datasetName &&
job.layerName
job.datasetName
) {
return (
<span>
Applied merger mode to layer {job.layerName} of{" "}
Materialize annotation for {job.layerName ? ` layer ${job.layerName} of ` : " "}
<Link to={`/datasets/${job.organizationName}/${job.datasetName}/view`}>
{job.datasetName}
</Link>{" "}
</Link>
{job.mergeSegments
? ". This includes merging the segments that were merged via merger mode."
: null}
</span>
);
} else {
Expand Down Expand Up @@ -239,7 +241,7 @@ class JobListView extends React.PureComponent<Props, State> {
} else if (
job.type === "infer_nuclei" ||
job.type === "infer_neurons" ||
job.type === "apply_merger_mode"
job.type === "materialize_volume_annotation"
) {
return (
<span>
Expand Down
3 changes: 0 additions & 3 deletions frontend/javascripts/libs/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -172,9 +172,6 @@ export function roundTo(value: number, digits: number): number {
export function capitalize(str: string): string {
return str[0].toUpperCase() + str.slice(1);
}
export function capitalizeWords(str: string): string {
return str.split(" ").map(capitalize).join(" ");
}

function intToHex(int: number, digits: number = 6): string {
return (_.repeat("0", digits) + int.toString(16)).slice(-digits);
Expand Down
4 changes: 2 additions & 2 deletions frontend/javascripts/oxalis/view/action-bar/toolbar_view.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ import { updateUserSettingAction } from "oxalis/model/actions/settings_actions";
import { usePrevious, useKeyPress } from "libs/react_hooks";
import { userSettings } from "types/schemas/user_settings.schema";
import ButtonComponent from "oxalis/view/components/button_component";
import { ApplyMergerModeModal } from "oxalis/view/right-border-tabs/starting_job_modals";
import { MaterializeVolumeAnnotationModal } from "oxalis/view/right-border-tabs/starting_job_modals";
import type { AnnotationTool, OverwriteMode } from "oxalis/constants";
import Constants, {
ToolsWithOverwriteCapabilities,
Expand Down Expand Up @@ -276,7 +276,7 @@ function AdditionalSkeletonModesButtons() {
</Tooltip>
)}
{features().jobsEnabled && showApplyMergerModeModal && (
<ApplyMergerModeModal handleClose={() => setShowApplyMergerModeModal(false)} />
<MaterializeVolumeAnnotationModal handleClose={() => setShowApplyMergerModeModal(false)} />
)}
</React.Fragment>
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import React from "react";
import _ from "lodash";

import classnames from "classnames";
import type { APIDataset, EditableLayerProperties } from "types/api_flow_types";
import type { APIDataLayer, APIDataset, EditableLayerProperties } from "types/api_flow_types";
import { ValueOf } from "types/globals";
import { AsyncIconButton } from "components/async_clickables";
import {
Expand Down Expand Up @@ -81,6 +81,7 @@ import Toast from "libs/toast";
import * as Utils from "libs/utils";
import api from "oxalis/api/internal_api";
import { settings } from "messages";
import { MaterializeVolumeAnnotationModal } from "oxalis/view/right-border-tabs/starting_job_modals";
import AddVolumeLayerModal from "./modals/add_volume_layer_modal";
import DownsampleVolumeModal from "./modals/downsample_volume_modal";
import Histogram, { isHistogramSupported } from "./histogram_view";
Expand Down Expand Up @@ -115,13 +116,15 @@ type State = {
// is shown for that VolumeTracing
volumeTracingToDownsample: VolumeTracing | null | undefined;
isAddVolumeLayerModalVisible: boolean;
layerToMergeWithFallback: APIDataLayer | null | undefined;
};

class DatasetSettings extends React.PureComponent<DatasetSettingsProps, State> {
onChangeUser: Record<keyof UserConfiguration, (...args: Array<any>) => any>;
state: State = {
volumeTracingToDownsample: null,
isAddVolumeLayerModalVisible: false,
layerToMergeWithFallback: null,
};

constructor(props: DatasetSettingsProps) {
Expand Down Expand Up @@ -196,6 +199,19 @@ class DatasetSettings extends React.PureComponent<DatasetSettingsProps, State> {
);
};

getMergeWithFallbackLayerButton = (layer: APIDataLayer) => (
<Tooltip title="Merge this volume annotation with its fallback layer.">
<i
onClick={() => this.setState({ layerToMergeWithFallback: layer })}
className="fas fa-object-ungroup"
style={{
cursor: "pointer",
opacity: 0.7,
}}
/>
</Tooltip>
);

getClipButton = (layerName: string, isInEditMode: boolean) => {
const editModeAddendum = isInEditMode
? "In Edit Mode, the histogram's range will be adjusted, too."
Expand Down Expand Up @@ -457,6 +473,9 @@ class DatasetSettings extends React.PureComponent<DatasetSettingsProps, State> {
<div className="flex-item">
{hasHistogram && !isDisabled ? this.getEditMinMaxButton(layerName, isInEditMode) : null}
</div>
<div className="flex-item">
{isVolumeTracing && !isDisabled ? this.getMergeWithFallbackLayerButton(layer) : null}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not every volume annotation has a fallback layer. Shouldn't this be checked before showing this button?

</div>
<div className="flex-item">
{this.getFindDataButton(layerName, isDisabled, isColorLayer, maybeVolumeTracing)}
</div>
Expand Down Expand Up @@ -639,12 +658,14 @@ class DatasetSettings extends React.PureComponent<DatasetSettingsProps, State> {
`Jumping to position ${foundPosition.join(", ")} and zooming to ${zoomValue.toFixed(2)}`,
);
};

reloadLayerData = async (layerName: string): Promise<void> => {
await clearCache(this.props.dataset, layerName);
await api.data.reloadBuckets(layerName);
window.needsRerender = true;
Toast.success(`Successfully reloaded data of layer ${layerName}.`);
};

getVolumeMagsToDownsample = (volumeTracing: VolumeTracing | null | undefined): Array<Vector3> => {
if (this.props.task != null) {
return [];
Expand Down Expand Up @@ -887,6 +908,13 @@ class DatasetSettings extends React.PureComponent<DatasetSettingsProps, State> {
/>
) : null}

{this.state.layerToMergeWithFallback != null ? (
<MaterializeVolumeAnnotationModal
selectedVolumeLayer={this.state.layerToMergeWithFallback}
handleClose={() => this.setState({ layerToMergeWithFallback: null })}
/>
) : null}

{this.state.isAddVolumeLayerModalVisible ? (
<AddVolumeLayerModal
dataset={this.props.dataset}
Expand Down
Loading