def test_cluster_algorithm(self): # Check with multiple jumps data # Inititalize Clusterizer clusterizer = HitClusterizer(pure_python=self.pure_python) # TEST 1 hits = create_hits(n_hits=10, max_column=100, max_row=100, max_frame=1, max_charge=2) clusterizer.cluster_hits(hits) # cluster hits _, clusters = clusterizer.get_hit_cluster(), clusterizer.get_cluster() # Define expected output expected_result = np.zeros(shape=(4, ), dtype=np.dtype([('event_number', '<i8'), ('ID', '<u2'), ('n_hits', '<u2'), ('charge', 'f4'), ('seed_column', '<u2'), ('seed_row', '<u2'), ('mean_column', 'f4'), ('mean_row', 'f4')])) expected_result['event_number'] = [0, 1, 2, 3] expected_result['n_hits'] = [3, 3, 3, 1] expected_result['charge'] = [1, 2, 1, 1] expected_result['seed_column'] = [2, 4, 8, 10] expected_result['seed_row'] = [3, 7, 15, 19] expected_result['mean_column'] = [2.0, 5.0, 8.0, 10.0] expected_result['mean_row'] = [3.0, 9.0, 15.0, 19.0] # Test results self.assertTrue((clusters == expected_result).all()) # TEST 2 clusterizer.create_cluster_hit_info_array(True) hits = create_hits(n_hits=10, max_column=100, max_row=100, max_frame=1, max_charge=2) clusterizer.cluster_hits(hits) # cluster hits cluster_hits, clusters = clusterizer.get_hit_cluster(), clusterizer.get_cluster() # Define expected output expected_result = np.zeros(shape=(10, ), dtype=np.dtype([('event_number', '<i8'), ('frame', '<u1'), ('column', '<u2'), ('row', '<u2'), ('charge', '<u2'), ('cluster_ID', '<i2'), ('is_seed', '<u1'), ('cluster_size', '<u2'), ('n_cluster', '<u2')])) expected_result['event_number'] = hits['event_number'] expected_result['frame'] = hits['frame'] expected_result['column'] = hits['column'] expected_result['row'] = hits['row'] expected_result['charge'] = hits['charge'] expected_result['is_seed'] = [0, 1, 0, 1, 0, 0, 0, 1, 0, 1] expected_result['cluster_size'] = [3, 3, 3, 3, 3, 3, 3, 3, 3, 1] expected_result['n_cluster'] = 1 # Test results self.assertEqual(cluster_hits.shape[0], 10) # hit clustering activated, thus this array have 10 entries self.assertTrue(np.array_equal(cluster_hits, expected_result))
def test_cluster_cuts(self): # Create some fake data hits = np.ones(shape=(2, ), dtype=np.dtype([('event_number', '<i8'), ('frame', '<u1'), ('column', '<u2'), ('row', '<u2'), ('charge', '<u2')])) hits[0]['column'], hits[0]['row'], hits[0]['charge'], hits[0]['event_number'] = 17, 36, 30, 19 hits[1]['column'], hits[1]['row'], hits[1]['charge'], hits[1]['event_number'] = 18, 36, 6, 19 # Create clusterizer object clusterizer = HitClusterizer(pure_python=self.pure_python) clusterizer.create_cluster_hit_info_array(True) # Case 1: Test max hit charge cut, accept all hits clusterizer.set_max_hit_charge(30) # only add hits with charge <= 30 clusterizer.cluster_hits(hits) # cluster hits # Check cluster cluster = clusterizer.get_cluster() expected_result = np.zeros(shape=(1, ), dtype=np.dtype([('event_number', '<i8'), ('ID', '<u2'), ('n_hits', '<u2'), ('charge', 'f4'), ('seed_column', '<u2'), ('seed_row', '<u2'), ('mean_column', 'f4'), ('mean_row', 'f4')])) expected_result['event_number'] = [19] expected_result['n_hits'] = [2] expected_result['charge'] = [36] expected_result['seed_column'] = [17] expected_result['seed_row'] = [36] expected_result['mean_column'] = [17.18420982] expected_result['mean_row'] = [36.0] self.assertTrue(np.array_equal(cluster, expected_result)) # Check cluster hit info cluster_hits = clusterizer.get_hit_cluster() expected_result = np.zeros(shape=(2, ), dtype=np.dtype([('event_number', '<i8'), ('frame', '<u1'), ('column', '<u2'), ('row', '<u2'), ('charge', '<u2'), ('cluster_ID', '<i2'), ('is_seed', '<u1'), ('cluster_size', '<u2'), ('n_cluster', '<u2')])) expected_result['event_number'] = hits['event_number'] expected_result['frame'] = hits['frame'] expected_result['column'] = hits['column'] expected_result['row'] = hits['row'] expected_result['charge'] = hits['charge'] expected_result['is_seed'] = [1, 0] expected_result['cluster_size'] = [2, 2] expected_result['n_cluster'] = 1 self.assertTrue(np.array_equal(cluster_hits, expected_result)) # Case 2: Test max hit charge cut, omit charge > 29 hits hits['event_number'] = 20 clusterizer.set_max_hit_charge(29) # only add hits with charge <= 30 clusterizer.cluster_hits(hits) # cluster hits # Check cluster cluster = clusterizer.get_cluster() expected_result = np.zeros(shape=(1, ), dtype=np.dtype([('event_number', '<i8'), ('ID', '<u2'), ('n_hits', '<u2'), ('charge', 'f4'), ('seed_column', '<u2'), ('seed_row', '<u2'), ('mean_column', 'f4'), ('mean_row', 'f4')])) expected_result['event_number'] = [20] expected_result['n_hits'] = [1] expected_result['charge'] = [6] expected_result['seed_column'] = [18] expected_result['seed_row'] = [36] expected_result['mean_column'] = [18.0] expected_result['mean_row'] = [36.0] self.assertTrue(np.array_equal(cluster, expected_result)) # Check cluster hit info cluster_hits = clusterizer.get_hit_cluster() expected_result = np.zeros(shape=(2, ), dtype=np.dtype([('event_number', '<i8'), ('frame', '<u1'), ('column', '<u2'), ('row', '<u2'), ('charge', '<u2'), ('cluster_ID', '<i2'), ('is_seed', '<u1'), ('cluster_size', '<u2'), ('n_cluster', '<u2')])) expected_result['event_number'] = hits['event_number'] expected_result['frame'] = hits['frame'] expected_result['column'] = hits['column'] expected_result['row'] = hits['row'] expected_result['charge'] = hits['charge'] expected_result['cluster_ID'] = [-1, 0] expected_result['is_seed'] = [0, 1] expected_result['cluster_size'] = [0, 1] expected_result['n_cluster'] = [1, 1] self.assertTrue(np.array_equal(cluster_hits, expected_result)) # Case 3: Add the same hit within an event # Create some fake data hits = np.ones(shape=(3, ), dtype=np.dtype([('event_number', '<i8'), ('frame', '<u1'), ('column', '<u2'), ('row', '<u2'), ('charge', '<u2')])) hits[0]['column'], hits[0]['row'], hits[0]['charge'], hits[0]['event_number'] = 18, 36, 6, 19 hits[1]['column'], hits[1]['row'], hits[1]['charge'], hits[1]['event_number'] = 18, 36, 6, 19 hits[2]['column'], hits[2]['row'], hits[2]['charge'], hits[2]['event_number'] = 18, 38, 6, 19 expected_hit_result = np.zeros(shape=(3, ), dtype=np.dtype([('event_number', '<i8'), ('frame', '<u1'), ('column', '<u2'), ('row', '<u2'), ('charge', '<u2'), ('cluster_ID', '<i2'), ('is_seed', '<u1'), ('cluster_size', '<u2'), ('n_cluster', '<u2')])) expected_cluster_result = np.zeros(shape=(1, ), dtype=np.dtype([('event_number', '<i8'), ('ID', '<u2'), ('n_hits', '<u2'), ('charge', 'f4'), ('seed_column', '<u2'), ('seed_row', '<u2'), ('mean_column', 'f4'), ('mean_row', 'f4')])) expected_hit_result['event_number'] = hits['event_number'] expected_hit_result['frame'] = hits['frame'] expected_hit_result['column'] = hits['column'] expected_hit_result['row'] = hits['row'] expected_hit_result['charge'] = hits['charge'] expected_hit_result['cluster_ID'] = [0, -2, 0] expected_hit_result['is_seed'] = [1, 0, 0] expected_hit_result['cluster_size'] = [2, 0, 2] expected_hit_result['n_cluster'] = [1, 1, 1] expected_cluster_result['event_number'] = [19] expected_cluster_result['n_hits'] = [2] expected_cluster_result['charge'] = [12] expected_cluster_result['seed_column'] = [18] expected_cluster_result['seed_row'] = [36] expected_cluster_result['mean_column'] = [18.0] expected_cluster_result['mean_row'] = [37.0] clusterizer.ignore_same_hits(True) # If a hit occured 2 times in an event it is ignored and gets the cluster index -2 cluster_hits, cluster = clusterizer.cluster_hits(hits) # Cluster hits self.assertTrue(np.array_equal(cluster_hits, expected_hit_result)) self.assertTrue(np.array_equal(cluster, expected_cluster_result)) clusterizer.ignore_same_hits(False) # If a hit occured 2 times in an event it is used as a normal hit cluster_hits, cluster = clusterizer.cluster_hits(hits) # Cluster hits expected_hit_result['cluster_ID'] = [0, 0, 0] expected_hit_result['is_seed'] = [1, 0, 0] expected_hit_result['cluster_size'] = [3, 3, 3] expected_hit_result['n_cluster'] = [1, 1, 1] self.assertTrue(np.array_equal(cluster_hits, expected_hit_result))