def test_WND5_all_features(self): epsilon = 0.00001 # Define paths to original files test_sig_path = join(test_dir, 't1_s01_c05_ij-l_precalculated.sig') test_fit_path = join(test_dir, 'test-l.fit') test_feat_wght_path = join(test_dir, 'test_fit-l.weights') test_tif_path = join(test_dir, 't1_s01_c05_ij.tif') # Here are the correct values that Python API needs to return: # wndchrm classify -l -f0.75 test-l.fit t1_s01_c05_ij.tif # t1_s01_c05_ij.tif 1.6e-27 0.083 0.917 * 4cell 3.835 # wndchrm classify -l test-l.fit t1_s01_c05_ij.tif # t1_s01_c05_ij.tif 3.19e-27 0.076 0.924 * 4cell 3.848 # wndchrm classify -l -f0.05 test-l.fit t1_s01_c05_ij.tif # t1_s01_c05_ij.tif 1.06e-26 0.066 0.934 * 4cell 3.869 correct_marg_probs = {} correct_marg_probs[2189] = [0.083, 0.917] correct_marg_probs[438] = [0.076, 0.924] correct_marg_probs[146] = [0.066, 0.934] # Load the original files once and only once for all this class's tests feature_set = FeatureSpace.NewFromFitFile(test_fit_path) fs1 = feature_set.feature_names feature_set.Normalize() fs2 = feature_set.feature_names self.assertSequenceEqual(fs1, fs2) test_sample = FeatureVector(source_filepath=test_tif_path, long=True) test_sample.LoadSigFile(test_sig_path) self.assertSequenceEqual(feature_set.feature_names, test_sample.feature_names) test_sample.Normalize(feature_set) all_weights = FisherFeatureWeights.NewFromFile(test_feat_wght_path) def Check(num_feats): weights = all_weights.Threshold(num_feats) feat_set = feature_set.FeatureReduce(weights) sample = test_sample.FeatureReduce(weights) result = SingleSampleClassification.NewWND5( feat_set, weights, sample) result_marg_probs = [ round( val, 3 ) \ for val in result.marginal_probabilities ] for target_val, res_val in zip(correct_marg_probs[num_feats], result_marg_probs): self.assertAlmostEqual(target_val, res_val, delta=epsilon) for num_feats in correct_marg_probs: Check(num_feats)
def test_LoadSubsetFromFile(self): """Calculate one feature family, store to sig, load sig, and use to create larger fs""" img_filename = "lymphoma_eosin_channel_MCL_test_img_sj-05-3362-R2_001_E.tif" orig_img_filepath = pychrm_test_dir + sep + img_filename full_list = list(( 'Pixel Intensity Statistics () [3]', 'Pixel Intensity Statistics (Fourier ()) [3]', )) tempdir = mkdtemp() from shutil import copy try: # copy the tiff to the tempdir so the .sig files end up there too copy(orig_img_filepath, tempdir) input_img_path = tempdir + sep + img_filename kwargs = {} kwargs['source_filepath'] = input_img_path kwargs['tile_num_cols'] = 6 kwargs['tile_num_rows'] = 5 kwargs['tiling_scheme'] = '5x6' kwargs['tile_col_index'] = 0 kwargs['tile_row_index'] = 0 kwargs['feature_names'] = full_list[1:] fv1 = FeatureVector(**kwargs).GenerateFeatures(quiet=False) # modify the sig value and write to sig file to make sure subsequent loading # used the value from disk and not recalculated it: fv1.values[0] = -9999 fv1.ToSigFile(quiet=False) # Now, ask for more features: kwargs['feature_names'] = full_list fv2 = FeatureVector(**kwargs) with self.assertRaises(IncompleteFeatureSetError): fv2.LoadSigFile() #import pdb; pdb.set_trace() fv2.GenerateFeatures() #self.assertEqual( fv1.values[0], fv2.values[0] ) finally: rmtree(tempdir)