def test_dont_load_file():
    csv_text = """"Image_FileName_DNA","Image_PathName_DNA"
"%s","%s"
""" % (
        test_filename,
        test_path,
    )
    pipeline, module, filename = make_pipeline(csv_text)
    c0_ran = [False]

    def callback(workspace):
        imgset = workspace.image_set
        assert len(imgset.names) == 0
        c0_ran[0] = True

    c0 = C0()
    c0.callback = callback
    c0.set_module_num(1)
    pipeline.add_module(c0)
    try:
        module.wants_images.value = False
        pipeline.run()
        assert c0_ran[0]
    finally:
        os.remove(filename)
def test_scaling():
    """Test loading an image scaled and unscaled"""
    folder = "loaddata"
    file_name = "1-162hrh2ax2.tif"
    path = tests.modules.make_12_bit_image(folder, file_name, (22, 18))
    csv_text = (
        "Image_PathName_MyFile,Image_FileName_MyFile\n" "%s,%s\n" % os.path.split(path)
    )
    c0_image = []
    for rescale in (False, True):
        pipeline, module, filename = make_pipeline(csv_text)
        try:
            module.rescale.value = rescale

            def callback(workspace):
                imgset = workspace.image_set
                image = imgset.get_image("MyFile")
                pixels = image.pixel_data
                c0_image.append(pixels.copy())

            c0 = C0()
            c0.callback = callback
            c0.set_module_num(2)
            pipeline.add_module(c0)
            pipeline.run()
        finally:
            os.remove(filename)
    unscaled, scaled = c0_image
    numpy.testing.assert_almost_equal(unscaled * 65535.0 / 4095.0, scaled)
def test_metadata_row_and_column_and_well():
    csv_text = """"Metadata_Row","Metadata_Column","Metadata_Well"
"C","03","B14"
"""
    pipeline, module, filename = make_pipeline(csv_text)
    columns = module.get_measurement_columns(pipeline)
    assert any([
        c[0] == cellprofiler_core.measurement.IMAGE and c[1] == "Metadata_Row"
        and c[2] == "varchar(1)" for c in columns
    ])
    assert any([
        c[0] == cellprofiler_core.measurement.IMAGE
        and c[1] == "Metadata_Column" and c[2] == "varchar(2)" for c in columns
    ])
    assert any([
        c[0] == cellprofiler_core.measurement.IMAGE and c[1] == "Metadata_Well"
        and c[2] == "varchar(3)" for c in columns
    ])
    m = pipeline.run()
    features = module.get_measurements(
        pipeline,
        cellprofiler_core.measurement.IMAGE,
        cellprofiler_core.measurement.C_METADATA,
    )
    for feature, expected in (("Row", "C"), ("Column", "03"), ("Well", "B14")):
        assert feature in features
        value = m.get_current_image_measurement("_".join(
            (cellprofiler_core.measurement.C_METADATA, feature)))
        assert value == expected
def test_load_file():
    csv_text = """"Image_FileName_DNA","Image_PathName_DNA"
"%s","%s"
""" % (
        test_filename,
        test_path,
    )
    pipeline, module, filename = make_pipeline(csv_text)
    c0_ran = [False]

    def callback(workspace):
        imgset = workspace.image_set
        image = imgset.get_image("DNA")
        pixels = image.pixel_data
        assert pixels.shape[0] == test_shape[0]
        c0_ran[0] = True

    c0 = C0()
    c0.callback = callback
    c0.set_module_num(2)
    pipeline.add_module(c0)

    try:
        m = pipeline.run()
        assert isinstance(m, cellprofiler_core.measurement.Measurements)
        assert c0_ran[0]
        hexdigest = m.get_current_image_measurement("MD5Digest_DNA")
        assert hexdigest == test_md5
        assert "PathName_DNA" in m.get_feature_names(cellprofiler_core.measurement.IMAGE)
        assert m.get_current_image_measurement("PathName_DNA") == test_path
        assert "FileName_DNA" in m.get_feature_names(cellprofiler_core.measurement.IMAGE)
        assert m.get_current_image_measurement("FileName_DNA") == test_filename
    finally:
        os.remove(filename)
def test_metadata():
    csv_text = """"Metadata_Plate"
"P-12345"
"""
    pipeline, module, filename = make_pipeline(csv_text)
    m = pipeline.run()
    data = m.get_current_image_measurement("Metadata_Plate")
    assert data == "P-12345"
    os.remove(filename)
def test_int_image_measurement():
    csv_text = """"Test_Measurement"
1
"""
    pipeline, module, filename = make_pipeline(csv_text)
    m = pipeline.run()
    data = m.get_current_image_measurement("Test_Measurement")
    assert isinstance(data, numpy.int), "data is type %s, not np.int" % (type(data))
    assert data == 1
    os.remove(filename)
def test_float_image_measurement():
    csv_text = """"Test_Measurement"
1.5
"""
    pipeline, module, filename = make_pipeline(csv_text)
    m = pipeline.run()
    data = m.get_current_image_measurement("Test_Measurement")
    assert numpy.isreal(data)
    assert round(abs(data - 1.5), 7) == 0
    os.remove(filename)
def test_string_image_measurement():
    csv_text = """"Test_Measurement"
"Hello, world"
"""
    pipeline, module, filename = make_pipeline(csv_text)
    m = pipeline.run()
    data = m.get_current_image_measurement("Test_Measurement")
    assert not numpy.isreal(data)
    assert data == "Hello, world"
    os.remove(filename)
def test_long_int_image_measurement():
    csv_text = """"Test_Measurement"
1234567890123
"""
    pipeline, module, filename = make_pipeline(csv_text)
    m = pipeline.run()
    data = m.get_current_image_measurement("Test_Measurement")
    assert isinstance(
        data, six.text_type
    ), "Expected <type 'six.text_type'> got %s" % type(data)
    assert data == "1234567890123"
    os.remove(filename)
def test_load_bcb_file():
    csv_text = """ELN_RUN_ID,CBIP_RUN_ID,ASSAY_PLATE_BARCODE,\
MX_PLATE_ID,ASSAY_WELL_POSITION,ASSAY_WELL_ROLE,SITE_X,SITE_Y,\
MICROSCOPE,SOURCE_DESCRIPTION,DATE_CREATED,FILE_PATH,FILE_NAME,\
CPD_PLATE_MAP_NAME,CPD_WELL_POSITION,BROAD_ID,\
CPD_MMOL_CONC,SOURCE_NAME,SOURCE_COMPOUND_NAME,CPD_SMILES
"4012-10-W01-01-02","4254","BR00021547","20777","N01","COMPOUND",\
"2","2","GS IX Micro","DAPI","2010/03/19 06:01:12","%s",\
"%s","C-4012-00-D80-001_Rev3","N01",\
"BRD-K71194192-001-01-6","2.132352941","ChemBridge","",\
"Oc1ccnc(SCC(=O)Nc2ccc(Oc3ccccc3)cc2)n1"
""" % (
        test_path,
        test_filename,
    )
    pipeline, module, filename = make_pipeline(csv_text)
    c0_ran = [False]

    def callback(workspace):
        imgset = workspace.image_set
        image = imgset.get_image("DAPI")
        pixels = image.pixel_data
        assert pixels.shape[0] == test_shape[0]
        c0_ran[0] = True

    c0 = C0()
    c0.callback = callback
    c0.set_module_num(2)
    pipeline.add_module(c0)

    try:
        m = pipeline.run()
        assert isinstance(m, cellprofiler_core.measurement.Measurements)
        assert c0_ran[0]
        hexdigest = m.get_current_image_measurement("MD5Digest_DAPI")
        assert hexdigest == test_md5
        assert "PathName_DAPI" in m.get_feature_names(
            cellprofiler_core.measurement.IMAGE)
        assert m.get_current_image_measurement("PathName_DAPI") == test_path
        assert "FileName_DAPI" in m.get_feature_names(
            cellprofiler_core.measurement.IMAGE)
        assert m.get_current_image_measurement(
            "FileName_DAPI") == test_filename
    finally:
        os.remove(filename)
def test_alternate_image_start():
    csv_text = """"Metadata_Measurement"
1
2
3
4
5
6
7
8
9
10
"""
    pipeline, module, filename = make_pipeline(csv_text)
    m = pipeline.run(image_set_start=2)
    data = m.get_all_measurements(cellprofiler_core.measurement.IMAGE,
                                  "Metadata_Measurement")
    assert all([data[i - 2] == i for i in range(2, 11)])
    os.remove(filename)
def test_some_rows():
    csv_text = """"Test_Measurement"
1
2
3
4
5
6
7
8
9
10
"""
    pipeline, module, filename = make_pipeline(csv_text)
    module.wants_rows.value = True
    module.row_range.min = 4
    module.row_range.max = 6
    m = pipeline.run()
    assert isinstance(m, cellprofiler_core.measurement.Measurements)
    data = m.get_all_measurements(cellprofiler_core.measurement.IMAGE, "Test_Measurement")
    assert numpy.all(data == numpy.arange(4, 7))
    os.remove(filename)
def test_img_717():
    """Regression test of img-717, column without underbar"""
    csv_text = """"Image","Test_Measurement"
"foo",1
"foo",2
"foo",3
"foo",4
"foo",5
"foo",6
"foo",7
"foo",8
"foo",9
"foo",10
"""
    pipeline, module, filename = make_pipeline(csv_text)
    module.wants_rows.value = True
    module.row_range.min = 4
    module.row_range.max = 6
    m = pipeline.run()
    assert isinstance(m, cellprofiler_core.measurement.Measurements)
    data = m.get_all_measurements(cellprofiler_core.measurement.IMAGE, "Test_Measurement")
    assert numpy.all(data == numpy.arange(4, 7))
    os.remove(filename)
Exemple #14
0
def run_pipeline_headless(options, args):
    """
    Run a CellProfiler pipeline in headless mode
    """
    if options.first_image_set is not None:
        if not options.first_image_set.isdigit():
            raise ValueError(
                "The --first-image-set option takes a numeric argument")
        else:
            image_set_start = int(options.first_image_set)
    else:
        image_set_start = 1

    image_set_numbers = None

    if options.last_image_set is not None:
        if not options.last_image_set.isdigit():
            raise ValueError(
                "The --last-image-set option takes a numeric argument")
        else:
            image_set_end = int(options.last_image_set)

            if image_set_start is None:
                image_set_numbers = numpy.arange(1, image_set_end + 1)
            else:
                image_set_numbers = numpy.arange(image_set_start,
                                                 image_set_end + 1)
    else:
        image_set_end = None

    if (options.pipeline_filename is not None) and (
            not options.pipeline_filename.lower().startswith("http")):
        options.pipeline_filename = os.path.expanduser(
            options.pipeline_filename)

    pipeline = cellprofiler_core.pipeline.Pipeline()

    initial_measurements = None

    try:
        if h5py.is_hdf5(options.pipeline_filename):
            initial_measurements = cellprofiler_core.measurement.load_measurements(
                options.pipeline_filename, image_numbers=image_set_numbers)
    except:
        logging.root.info("Failed to load measurements from pipeline")

    if initial_measurements is not None:
        pipeline_text = initial_measurements.get_experiment_measurement(
            cellprofiler_core.pipeline.M_PIPELINE)

        pipeline_text = pipeline_text

        pipeline.load(six.moves.StringIO(pipeline_text))

        if not pipeline.in_batch_mode():
            #
            # Need file list in order to call prepare_run
            #

            with h5py.File(options.pipeline_filename, "r") as src:
                if cellprofiler_core.utilities.hdf5_dict.HDF5FileList.has_file_list(
                        src):
                    cellprofiler_core.utilities.hdf5_dict.HDF5FileList.copy(
                        src, initial_measurements.hdf5_dict.hdf5_file)
    else:
        pipeline.load(options.pipeline_filename)

    if options.groups is not None:
        kvs = [x.split("=") for x in options.groups.split(",")]

        groups = dict(kvs)
    else:
        groups = None

    file_list = cellprofiler_core.preferences.get_image_set_file()

    if file_list is not None:
        pipeline.read_file_list(file_list)
    elif options.image_directory is not None:
        pathnames = []

        for dirname, _, fnames in os.walk(
                os.path.abspath(options.image_directory)):
            pathnames.append([
                os.path.join(dirname, fname) for fname in fnames
                if os.path.isfile(os.path.join(dirname, fname))
            ])

        pathnames = sum(pathnames, [])

        pipeline.add_pathnames_to_file_list(pathnames)

    #
    # Fixup CreateBatchFiles with any command-line input or output directories
    #
    if pipeline.in_batch_mode():
        create_batch_files = [
            m for m in pipeline.modules() if m.is_create_batch_module()
        ]

        if len(create_batch_files) > 0:
            create_batch_files = create_batch_files[0]

            if options.output_directory is not None:
                create_batch_files.custom_output_directory.value = (
                    options.output_directory)

            if options.image_directory is not None:
                create_batch_files.default_image_directory.value = (
                    options.image_directory)

    use_hdf5 = len(args) > 0 and not args[0].lower().endswith(".mat")

    measurements = pipeline.run(
        image_set_start=image_set_start,
        image_set_end=image_set_end,
        grouping=groups,
        measurements_filename=None if not use_hdf5 else args[0],
        initial_measurements=initial_measurements,
    )

    if len(args) > 0 and not use_hdf5:
        pipeline.save_measurements(args[0], measurements)

    if options.done_file is not None:
        if measurements is not None and measurements.has_feature(
                cellprofiler_core.measurement.EXPERIMENT,
                cellprofiler_core.pipeline.EXIT_STATUS,
        ):
            done_text = measurements.get_experiment_measurement(
                cellprofiler_core.pipeline.EXIT_STATUS)

            exit_code = 0 if done_text == "Complete" else -1
        else:
            done_text = "Failure"

            exit_code = -1

        fd = open(options.done_file, "wt")
        fd.write("%s\n" % done_text)
        fd.close()
    elif not measurements.has_feature(cellprofiler_core.measurement.EXPERIMENT,
                                      cellprofiler_core.pipeline.EXIT_STATUS):
        # The pipeline probably failed
        exit_code = 1
    else:
        exit_code = 0

    if measurements is not None:
        measurements.close()

    return exit_code