예제 #1
0
  def test_run_snp_sites(self):
    builder = SNPFeatureBuilder()

    fasta_filename = os.path.join(test_data(), 'file_with_SNPs.aln')

    with context_aware_tempdir() as output_directory:
      stdout, stderr = builder._run_snp_sites('snp-sites', {},
                                             fasta_filename,
                                             output_directory)

      expected_output_filename = os.path.join(output_directory, 'all_snps.vcf')
      self.assertTrue(os.path.isfile(expected_output_filename))
예제 #2
0
  def test_add_record_to_features(self):
    builder = SNPFeatureBuilder()

    record = FakeRecord(1,1,['0', '0', '1'])
    builder._add_record_to_features(record)

    self.assertItemsEqual(builder.features.keys(), ['sample_0', 'sample_1',
                                                    'sample_2'])
    self.assertEqual(builder.features['sample_0'], [0])
    self.assertEqual(builder.features['sample_1'], [0])
    self.assertEqual(builder.features['sample_2'], [1])
    self.assertEqual(builder.feature_labels, ['SNP:1:1'])

    record = FakeRecord(1,2,['0', '1', '2'])
    builder._add_record_to_features(record)

    self.assertItemsEqual(builder.features.keys(), ['sample_0', 'sample_1',
                                                    'sample_2'])
    self.assertEqual(builder.features['sample_0'], [0,0])
    self.assertEqual(builder.features['sample_1'], [0,1])
    self.assertEqual(builder.features['sample_2'], [1,1])
    self.assertEqual(builder.feature_labels, ['SNP:1:1', 'SNP:1:2'])

    record = FakeRecord(1,3,['1', '2', '0'])
    record.samples[1].data.__delattr__('GT') # One of the samples is missing an 'AB'
    builder._add_record_to_features(record)

    self.assertItemsEqual(builder.features.keys(), ['sample_0', 'sample_1',
                                                    'sample_2'])
    self.assertEqual(builder.features['sample_0'], [0,0])
    self.assertEqual(builder.features['sample_1'], [0,1])
    self.assertEqual(builder.features['sample_2'], [1,1])
    self.assertEqual(builder.feature_labels, ['SNP:1:1', 'SNP:1:2'])
예제 #3
0
  def test_create_features(self):
    builder = SNPFeatureBuilder()
    fake_vcf = []
    fake_vcf.append(FakeRecord(1,1,['0', '0', '1']))
    fake_vcf.append(FakeRecord(1,2,['0', '1', '2']))
    fake_vcf.append(FakeRecord(1,3,['1', '2', '0']))
    builder._get_records_from_vcf=MagicMock(return_value=fake_vcf)

    builder.create_features()

    self.assertItemsEqual(builder.features.keys(), ['sample_0', 'sample_1',
                                                    'sample_2'])
    self.assertEqual(builder.features['sample_0'], [0,0,1])
    self.assertEqual(builder.features['sample_1'], [0,1,1])
    self.assertEqual(builder.features['sample_2'], [1,1,0])
    self.assertEqual(builder.feature_labels, ['SNP:1:1', 'SNP:1:2', 'SNP:1:3'])

    fake_vcf = [FakeRecord(2,1,['1', '0'])]
    builder._get_records_from_vcf=MagicMock(return_value=fake_vcf)

    builder.create_features()

    self.assertItemsEqual(builder.features.keys(), ['sample_0', 'sample_1'])
    self.assertEqual(builder.features['sample_0'], [1])
    self.assertEqual(builder.features['sample_1'], [0])
    self.assertEqual(builder.feature_labels, ['SNP:2:1'])
예제 #4
0
  def test_create_vcf_from_sequences(self, temp_mock, ctx_tempfile_mock,
                                     ctx_tempdir_mock):
    builder = SNPFeatureBuilder()

    temp_vcf_file = tempfile.NamedTemporaryFile('w', delete=False)

    temp_files = []
    temp_folders = []
    ctx_tempfile_mock.side_effect = create_context_aware_tempfile_mock(temp_files)
    ctx_tempdir_mock.side_effect = create_context_aware_tempdir_mock(temp_folders)
    temp_mock.NamedTemporaryFile.return_value = temp_vcf_file

    fasta_filename = os.path.join(test_data(), 'file_with_SNPs.aln')
    fasta_file = open(fasta_filename, 'r')

    builder.load_fasta_sequences(fasta_file)
    builder.create_vcf_from_sequences()

    self.assertEqual(len(temp_files), 1)
    self.assertFalse(os.path.isfile(temp_files[0]))
    self.assertEqual(len(temp_folders), 1)
    self.assertFalse(os.path.isdir(temp_folders[0]))
    self.assertTrue(os.path.isfile(temp_vcf_file.name))

    builder.vcf_input_file.seek(0)
    records = SNPSitesReader(builder.vcf_input_file)
    number_of_records = sum((1 for record in records))

    self.assertEqual(number_of_records, 5)

    fasta_file.close()
    temp_vcf_file.close()
    os.remove(temp_vcf_file.name)
예제 #5
0
  def test_get_records_from_vcf(self):
    builder = SNPFeatureBuilder()

    fasta_filename = os.path.join(test_data(), 'file_with_SNPs.aln')
    fasta_file = open(fasta_filename, 'r')

    builder.load_fasta_sequences(fasta_file)
    builder.create_vcf_from_sequences()

    records = builder._get_records_from_vcf()
    number_of_records = sum((1 for record in records))
    self.assertEqual(number_of_records, 5)

    records = builder._get_records_from_vcf()
    number_of_records = sum((1 for record in records))
    self.assertEqual(number_of_records, 5)
예제 #6
0
  def test_create_vcf_from_sequences_does_not_delete_existing(self, os_mock):
    builder = SNPFeatureBuilder()
    os_mock.remove.side_effect = os.remove
    with context_aware_tempfile('w', delete=False) as temp_vcf_file:
      builder.vcf_input_file = temp_vcf_file

      fasta_filename = os.path.join(test_data(), 'file_with_SNPs.aln')
      fasta_file = open(fasta_filename, 'r')

      builder.load_fasta_sequences(fasta_file)
      builder.create_vcf_from_sequences()

      self.assertFalse(temp_vcf_file.name in os_mock.remove.call_args_list)
예제 #7
0
  def test_create_vcf_from_sequences_deletes_when_done(self, os_mock):
    builder = SNPFeatureBuilder()
    os_mock.remove.side_effect = os.remove

    fasta_filename = os.path.join(test_data(), 'file_with_SNPs.aln')
    fasta_file = open(fasta_filename, 'r')

    builder.load_fasta_sequences(fasta_file)
    builder.create_vcf_from_sequences()

    temp_vcf_filename = builder.vcf_input_file.name
    del(builder)
    os_mock.remove.assert_any_call(temp_vcf_filename)
    try:
      os.remove(temp_vcf_filename)
    except OSError:
      # Looks like it's already deleted
      pass