Exemplo n.º 1
0
def main():

    #------------------------------
    # 			MAIN
    #------------------------------

    imp_name = imp.getTitle()
    imp_name, ext = os.path.splitext(imp_name)

    models, channel_names, prob_threshs, nms_threshs = [], [], [], []
    if stardist_membrane_enabled:
        models.append(stardist_membrane)
        channel_names.append('Membrane')
        prob_threshs.append(prob_thresh_membrane)
        nms_threshs.append(nms_thresh_membrane)
    if stardist_dna_enabled:
        models.append(stardist_dna)
        channel_names.append('DNA')
        prob_threshs.append(prob_thresh_dna)
        nms_threshs.append(nms_thresh_dna)

    if len(models) == 0:
        return error("no stardist model enabled")

    if tracking_channel not in channel_names:
        return error("channel %s cannot be tracked, must be one of %s" %
                     (tracking_channel, channel_names))

    n_channels = imp.getNChannels()
    n_frames = imp.getNFrames()
    is_hyperstack = n_channels > 1
    if n_frames < 2:
        return error("input must be a timelapse")
    if n_channels != len(models):
        return error(
            "input image has %d channels, but %d stardist model(s) enabled" %
            (n_channels, len(models)))

    export_calibration(imp, save_path(save_dir, imp_name, 'calibration.json'))

    channel_imps = ChannelSplitter.split(imp)

    args = zip(channel_names, channel_imps, models, prob_threshs, nms_threshs)

    if tracking_channel == 'Membrane':
        args = reversed(args)  # tracking_channel must come last

    params = {}
    params['modelChoice'] = "Model (.zip) from File"
    params['outputType'] = "ROI Manager"
    # params['roiPosition'] = "Automatic" # doesn't work because single channels are fed to StarDist, but result may be displayed on hyperstack
    params['roiPosition'] = "Hyperstack" if n_channels > 1 else "Stack"

    print "\n===============================\n"
    for channel_name, channel, model, prob_thresh, nms_thresh in args:
        params['input'] = channel
        params['modelFile'] = model.getAbsolutePath()
        params['probThresh'] = prob_thresh
        params['nmsThresh'] = nms_thresh

        # print 'StarDist', channel_name, ':', params, '\n'
        command.run(StarDist2D, False, params).get()
        rename_rois(rm, is_hyperstack)
        rm.runCommand(
            "Save",
            save_path(save_dir, imp_name,
                      'rois_%s.zip' % channel_name.lower()))
        export_rois(
            rm, is_hyperstack,
            save_path(save_dir, imp_name,
                      'rois_%s.json' % channel_name.lower()))

    assert channel_name == tracking_channel

    # backup global user-chosen measurements
    measurements = Analyzer.getMeasurements()
    # set needed measurements
    Analyzer.setMeasurements(Measurements.AREA + Measurements.CENTER_OF_MASS +
                             Measurements.STACK_POSITION)
    # create measurements table
    rm.runCommand(imp, "Measure")
    # restore global user-chosen measurements
    Analyzer.setMeasurements(measurements)

    # close/hide measurements table
    results_window = ResultsTable.getResultsWindow()
    results_window.close(False)
    # results_window.setVisible(False)

    # Remove overlay if any.
    imp.setOverlay(None)

    # Get results table.
    results_table = ResultsTable.getResultsTable()
    # print results_table

    # Create TrackMate instance.
    trackmate = create_trackmate(imp, results_table, frame_link_dist,
                                 gap_close_dist, seg_split_dist)

    #-----------------------
    # Process.
    #-----------------------

    ok = process(trackmate)
    if not ok:
        sys.exit(str(trackmate.getErrorMessage()))

    #-----------------------
    # Display results.
    #-----------------------

    # TODO: close trackmate gui?

    # Create the GUI and let it control display of results.
    display_results_in_GUI(trackmate, imp)

    color_and_export_rois_by_track(
        trackmate, rm,
        save_path(save_dir, imp_name,
                  'tracks_%s.csv' % tracking_channel.lower()))