Ejemplo n.º 1
0
 def test_03_08_a_sad_moment(self):
     #
     # Run using the good pipeline, but change one of the URLs so
     # an exception is thrown.
     #
     self.awthread = self.AWThread(self.announce_addr)
     self.awthread.start()
     self.set_work_socket()
     self.awthread.ex(self.awthread.aw.do_job, 
                      cpanalysis.WorkReply(
                          image_set_numbers = [2, 3],
                          worker_runs_post_group = False,
                          wants_dictionary = False))
     #
     # The worker should ask for the pipeline and preferences next.
     #
     req = self.awthread.recv(self.work_socket)
     self.assertIsInstance(req, cpanalysis.PipelinePreferencesRequest)
     self.assertEqual(req.analysis_id, self.analysis_id)
     
     input_dir = os.path.join(example_images_directory(), "ExampleSBSImages")
     cpprefs.set_default_image_directory(input_dir)
     preferences = {cpprefs.DEFAULT_IMAGE_DIRECTORY: 
                    cpprefs.config_read(cpprefs.DEFAULT_IMAGE_DIRECTORY) }
     
     rep = cpanalysis.Reply(
         pipeline_blob = np.array(GOOD_PIPELINE),
         preferences = preferences)
     req.reply(rep)
     #
     # The worker asks for the initial measurements.
     #
     req = self.awthread.recv(self.work_socket)
     self.assertIsInstance(req, cpanalysis.InitialMeasurementsRequest)
     self.assertEqual(req.analysis_id, self.analysis_id)
     m = get_measurements_for_good_pipeline(nimages=3)
     m[cpmeas.IMAGE, M_IMAGE_SET, 2] = np.zeros(100, np.uint8)
     try:
         req.reply(cpanalysis.Reply(buf = m.file_contents()))
     finally:
         m.close()
     #
     # Next, the worker asks for the shared dictionary
     #
     req = self.awthread.recv(self.work_socket)
     self.assertIsInstance(req, cpanalysis.SharedDictionaryRequest)
     shared_dictionaries = [{ ("foo%d" % i):"bar%d" % i} for i in range(1,8)]
     rep = cpanalysis.SharedDictionaryReply(
         dictionaries = shared_dictionaries)
     req.reply(rep)
     #
     # The worker should choke somewhere in NamesAndTypes, but we
     # tell the worker to skip the rest of the imageset.
     #
     req = self.awthread.recv(self.work_socket)
     self.assertIsInstance(req, cpanalysis.ExceptionReport)
     req.reply(cpanalysis.ExceptionPleaseDebugReply(disposition = ED_SKIP))
     #
     # The worker should send ImageSetSuccess for image set 2 anyway.
     #
     req = self.awthread.recv(self.work_socket)
     self.assertIsInstance(req, cpanalysis.ImageSetSuccess)
     self.assertEqual(req.image_set_number, 2)
     req.reply(cpanalysis.Ack())
     #
     # And then it tells us about image set 3
     #
     req = self.awthread.recv(self.work_socket)
     self.assertIsInstance(req, cpanalysis.ImageSetSuccess)
     self.assertEqual(req.image_set_number, 3)
     req.reply(cpanalysis.Ack())
     #
     # The worker should then report the measurements for both 2 and 3
     #
     req = self.awthread.recv(self.work_socket)
     self.assertIsInstance(req, cpanalysis.MeasurementsReport)
     self.assertSequenceEqual(req.image_set_numbers, [2, 3])
     m = cpmeas.load_measurements_from_buffer(req.buf)
     #
     # Spot check for some expected stuff
     #
     self.assertTrue(m.has_feature(cpmeas.IMAGE, C_COUNT+"_Nuclei"))
     self.assertTrue(m.has_feature("Nuclei", M_LOCATION_CENTER_X))
     self.assertTrue(m.has_feature("Nuclei", "AreaShape_Area"))
     #
     # The count for the skipped image should be None
     #
     count = m[cpmeas.IMAGE, C_COUNT + "_Nuclei", 2]
     self.assertIsNone(count)
     count = m[cpmeas.IMAGE, C_COUNT + "_Nuclei", 3]
     center_x = m["Nuclei", M_LOCATION_CENTER_X, 3]
     self.assertEqual(count, len(center_x))
     req.reply(cpanalysis.Ack())
     self.awthread.ecute()
Ejemplo n.º 2
0
 def test_03_06_the_happy_path_chapter_2(self):
     #
     # Give the worker image sets # 2 and 3 and tell it to run post_group
     #
     self.awthread = self.AWThread(self.announce_addr)
     self.awthread.start()
     self.set_work_socket()
     self.awthread.ex(self.awthread.aw.do_job, 
                      cpanalysis.WorkReply(
                          image_set_numbers = [2, 3],
                          worker_runs_post_group = True,
                          wants_dictionary = False))
     #
     # The worker should ask for the pipeline and preferences next.
     #
     req = self.awthread.recv(self.work_socket)
     self.assertIsInstance(req, cpanalysis.PipelinePreferencesRequest)
     self.assertEqual(req.analysis_id, self.analysis_id)
     
     input_dir = os.path.join(example_images_directory(), "ExampleSBSImages")
     cpprefs.set_default_image_directory(input_dir)
     preferences = {cpprefs.DEFAULT_IMAGE_DIRECTORY: 
                    cpprefs.config_read(cpprefs.DEFAULT_IMAGE_DIRECTORY) }
     
     rep = cpanalysis.Reply(
         pipeline_blob = np.array(DISPLAY_PIPELINE),
         preferences = preferences)
     req.reply(rep)
     #
     # The worker asks for the initial measurements.
     #
     req = self.awthread.recv(self.work_socket)
     self.assertIsInstance(req, cpanalysis.InitialMeasurementsRequest)
     self.assertEqual(req.analysis_id, self.analysis_id)
     m = get_measurements_for_good_pipeline(nimages=3)
     try:
         req.reply(cpanalysis.Reply(buf = m.file_contents()))
     finally:
         m.close()
     #
     # In group mode, the worker issues a display request and constructs
     # its own dictonaries
     #
     for image_number in (2, 3):
         #
         # The worker sends a display request for FlipAndRotate
         #
         req = self.awthread.recv(self.work_socket)
         self.assertIsInstance(req, cpanalysis.DisplayRequest)
         req.reply(cpanalysis.Ack())
         #
         # The worker sends ImageSetSuccess.
         #
         req = self.awthread.recv(self.work_socket)
         self.assertIsInstance(req, cpanalysis.ImageSetSuccess)
         self.assertEqual(req.image_set_number, image_number)
         req.reply(cpanalysis.Ack())
     #
     # The worker sends a DisplayPostGroup request for FlipAndRotate
     #
     req = self.awthread.recv(self.work_socket)
     self.assertIsInstance(req, cpanalysis.DisplayPostGroupRequest)
     self.assertEqual(req.image_set_number, 3)
     req.reply(cpanalysis.Ack())
     #
     # The worker sends a measurement report for image sets 2 and 3
     #
     req = self.awthread.recv(self.work_socket)
     self.assertIsInstance(req, cpanalysis.MeasurementsReport)
     self.assertSequenceEqual(req.image_set_numbers, [2, 3])
     m = cpmeas.load_measurements_from_buffer(req.buf)
     #
     # Spot check for some expected stuff
     #
     self.assertTrue(m.has_feature(cpmeas.IMAGE, C_COUNT+"_Nuclei"))
     self.assertTrue(m.has_feature("Nuclei", M_LOCATION_CENTER_X))
     self.assertTrue(m.has_feature("Nuclei", "AreaShape_Area"))
     req.reply(cpanalysis.Ack())
     self.awthread.ecute()
Ejemplo n.º 3
0
 def test_03_07_a_sad_ending(self):
     #
     # Run using the bad pipeline and lead the analysis worker
     # through debug post-mortem
     #
     self.awthread = self.AWThread(self.announce_addr)
     self.awthread.start()
     self.set_work_socket()
     self.awthread.ex(self.awthread.aw.do_job, 
                      cpanalysis.WorkReply(
                          image_set_numbers = [2],
                          worker_runs_post_group = False,
                          wants_dictionary = False))
     #
     # The worker should ask for the pipeline and preferences next.
     #
     req = self.awthread.recv(self.work_socket)
     self.assertIsInstance(req, cpanalysis.PipelinePreferencesRequest)
     self.assertEqual(req.analysis_id, self.analysis_id)
     
     input_dir = os.path.join(example_images_directory(), "ExampleSBSImages")
     cpprefs.set_default_image_directory(input_dir)
     preferences = {cpprefs.DEFAULT_IMAGE_DIRECTORY: 
                    cpprefs.config_read(cpprefs.DEFAULT_IMAGE_DIRECTORY) }
     
     rep = cpanalysis.Reply(
         pipeline_blob = np.array(BAD_PIPELINE),
         preferences = preferences)
     req.reply(rep)
     #
     # The worker asks for the initial measurements.
     #
     req = self.awthread.recv(self.work_socket)
     self.assertIsInstance(req, cpanalysis.InitialMeasurementsRequest)
     self.assertEqual(req.analysis_id, self.analysis_id)
     m = get_measurements_for_good_pipeline(nimages=2)
     try:
         req.reply(cpanalysis.Reply(buf = m.file_contents()))
     finally:
         m.close()
     #
     # Next, the worker asks for the shared dictionary
     #
     req = self.awthread.recv(self.work_socket)
     self.assertIsInstance(req, cpanalysis.SharedDictionaryRequest)
     shared_dictionaries = [{ ("foo%d" % i):"bar%d" % i} for i in range(1,8)]
     rep = cpanalysis.SharedDictionaryReply(
         dictionaries = shared_dictionaries)
     req.reply(rep)
     #
     # The worker should choke somewhere in NamesAndTypes
     #
     req = self.awthread.recv(self.work_socket)
     self.assertIsInstance(req, cpanalysis.ExceptionReport)
     password = "******"
     req.reply(cpanalysis.ExceptionPleaseDebugReply(
         disposition='DEBUG', 
         verification_hash = hashlib.sha1(password).hexdigest()))
     #
     # Next, the worker sends DebugWaiting once it binds to a port
     #
     req = self.awthread.recv(self.work_socket)
     self.assertIsInstance(req, cpanalysis.DebugWaiting)
     handle = None
     telnet_socket = socket.socket(socket.AF_INET, 
                                   proto = socket.IPPROTO_TCP)
     telnet_socket.connect(("127.0.0.1", req.port))
     try:
         req.reply(cpanalysis.Ack())
         #
         # Should say, "Verification: ", but it could change...
         #
         prompt = telnet_socket.recv(20)
         telnet_socket.send("corned beef\n")
         pdb = telnet_socket.recv(4000)
         telnet_socket.send("exit\n")
     finally:
         telnet_socket.close()
     req = self.awthread.recv(self.work_socket)
     self.assertIsInstance(req, cpanalysis.DebugComplete)
     req.reply(cpanalysis.ExceptionPleaseDebugReply(disposition = ED_STOP))
Ejemplo n.º 4
0
 def test_03_05_the_happy_path_chapter_1(self):
     #
     # Run the worker clear through to the end
     # for the first imageset
     #
     self.awthread = self.AWThread(self.announce_addr)
     self.awthread.start()
     self.set_work_socket()
     self.awthread.ex(self.awthread.aw.do_job, 
                      cpanalysis.WorkReply(
                          image_set_numbers = [1],
                          worker_runs_post_group = False,
                          wants_dictionary = True))
     #
     # The worker should ask for the pipeline and preferences next.
     #
     req = self.awthread.recv(self.work_socket)
     self.assertIsInstance(req, cpanalysis.PipelinePreferencesRequest)
     self.assertEqual(req.analysis_id, self.analysis_id)
     
     input_dir = os.path.join(example_images_directory(), "ExampleSBSImages")
     cpprefs.set_default_image_directory(input_dir)
     preferences = {cpprefs.DEFAULT_IMAGE_DIRECTORY: 
                    cpprefs.config_read(cpprefs.DEFAULT_IMAGE_DIRECTORY) }
     
     rep = cpanalysis.Reply(
         pipeline_blob = np.array(DISPLAY_PIPELINE),
         preferences = preferences)
     req.reply(rep)
     #
     # The worker asks for the initial measurements.
     #
     req = self.awthread.recv(self.work_socket)
     self.assertIsInstance(req, cpanalysis.InitialMeasurementsRequest)
     self.assertEqual(req.analysis_id, self.analysis_id)
     m = get_measurements_for_good_pipeline()
     try:
         req.reply(cpanalysis.Reply(buf = m.file_contents()))
     finally:
         m.close()
     #
     # Next, the worker asks for the shared dictionary
     #
     req = self.awthread.recv(self.work_socket)
     self.assertIsInstance(req, cpanalysis.SharedDictionaryRequest)
     shared_dictionaries = [{ ("foo%d" % i):"bar%d" % i} for i in range(1,8)]
     rep = cpanalysis.SharedDictionaryReply(
         dictionaries = shared_dictionaries)
     req.reply(rep)
     #
     # The worker sends a display request for FlipAndRotate
     #
     req = self.awthread.recv(self.work_socket)
     self.assertIsInstance(req, cpanalysis.DisplayRequest)
     self.assertEqual(req.image_set_number, 1)
     d = req.display_data_dict
     # Possibly, this will break if someone edits FlipAndRotate. Sorry.
     self.assertItemsEqual(d.keys(), 
                           ['vmax', 'output_image_pixel_data', 
                            'image_pixel_data', 'vmin'])
     self.assertIsInstance(d['output_image_pixel_data'], np.ndarray)
     req.reply(cpanalysis.Ack())
     #
     # The worker sends ImageSetSuccessWithDictionary.
     #
     req = self.awthread.recv(self.work_socket)
     self.assertIsInstance(req, cpanalysis.ImageSetSuccessWithDictionary)
     self.assertEqual(req.image_set_number, 1)
     for expected, actual in zip(shared_dictionaries, req.shared_dicts):
         self.assertDictEqual(expected, actual)
     req.reply(cpanalysis.Ack())
     #
     # The worker sends the measurement report
     #
     req = self.awthread.recv(self.work_socket)
     self.assertIsInstance(req, cpanalysis.MeasurementsReport)
     self.assertSequenceEqual(req.image_set_numbers, [1])
     m = cpmeas.load_measurements_from_buffer(req.buf)
     #
     # Spot check for some expected stuff
     #
     self.assertTrue(m.has_feature(cpmeas.IMAGE, C_COUNT+"_Nuclei"))
     self.assertTrue(m.has_feature("Nuclei", M_LOCATION_CENTER_X))
     self.assertTrue(m.has_feature("Nuclei", "AreaShape_Area"))
     req.reply(cpanalysis.Ack())
     self.awthread.ecute()