Exemplo n.º 1
0
    def test_unknown_filters(self):
        data_file = self.get_data_path(UNKNOWN)
        for name, letter in self.read_filter_data_file(data_file):
            passband = Passband(name)
            self.assertEqual(passband.system, UNKNOWN)
            self.assertEqual(passband.letter, letter)

        for letter in string.ascii_uppercase:
            if letter not in passband.ALL_LETTERS:
                with self.assertRaises(NonRecognizedPassband):
                    Passband(letter)
Exemplo n.º 2
0
    def _test_photometric_system(self, system):
        """Test that Passband parses a photometric system correctly.

        'system' must be the formal name of the photometric system, adequately
        capitalized, such as 'Johnson' or 'Cousins'. The Passband class must
        set the 'system' attribute to this value at instantiation time.

        """

        data_file = self.get_data_path(system)

        # For each two-element tuple, such as 'Johnson U', 'U', the first
        # element is used to instantiate a Passband object and we then make
        # sure that both the system is the letter are correctly parsed.
        for name, letter in self.read_filter_data_file(data_file):
            passband = Passband(name)
            self.assertEqual(passband.system, system)
            self.assertEqual(passband.letter, letter)

        # A sequence of the letters allowed by the photometric system.
        # In the case of Johnson, for example, they are 'UBVRIJHKLMN'.
        valid_letters = Passband.SYSTEM_LETTERS[system]

        # Letters other than the valid ones raise InvalidPassbandLetter
        for letter in string.ascii_uppercase:
            if letter not in valid_letters:
                name = "%s %s" % (system, letter)
                with self.assertRaises(InvalidPassbandLetter):
                    Passband(name)

        # There are some rare cases in which the letter of the photometric
        # filter cannot be identified and NonRecognizedPassband is raised.
        # For example, if more than one letter is given.

        two_letters = "".join(random.sample(valid_letters, 2))
        values = dict(system=system, letter=two_letters)
        patterns = (
            "%(system)s",  # e.g., "Johnson"
            "%(letter)s %(system)s",  # e.g., "BV Johnson"
            "%(system)s %(letter)s",  # e.g., "Johnson BV"
            "%(letter)s (%(system)s)",
        )  # e.g., "BV (Johnson)"

        for pattern in patterns:
            name = pattern % values
            with self.assertRaises(NonRecognizedPassband):
                Passband(name)
Exemplo n.º 3
0
    def test_all(self):

        # Make sure that, except for H-alpha, all the photometric systems
        # and letters are present in the list returned by Passband.all()
        pfilters = Passband.all()
        # There must not be duplicate Passband objects
        self.assertEqual(len(pfilters), len(set(pfilters)))
        for system, letters in Passband.SYSTEM_LETTERS.iteritems():
            for letter in letters:
                name = "%s %s" % (system, letter)
                pfilter = Passband(name)
                self.assertIn(pfilter, pfilters)

        # No user-defined filter must be missing either
        for name in passband.CUSTOM_FILTERS.iterkeys():
            pfilter = Passband(name)
            self.assertIn(pfilter, pfilters)
Exemplo n.º 4
0
 def test_random(self):
     # Make sure the returned filter is a valid one
     for _ in xrange(NITERS):
         pfilter = Passband.random()
         self.assertTrue(pfilter.system in Passband.ALL_SYSTEMS)
         # Neither custom nor H-alpha filters have letter
         if pfilter.system not in [CUSTOM, HALPHA]:
             self.assertTrue(pfilter.letter in Passband.SYSTEM_LETTERS[pfilter.system])
Exemplo n.º 5
0
 def test_random(self):
     # Make sure the returned filter is a valid one
     for _ in xrange(NITERS):
         pfilter = Passband.random()
         self.assertTrue(pfilter.system in Passband.ALL_SYSTEMS)
         # Neither custom nor H-alpha filters have letter
         if pfilter.system not in [CUSTOM, HALPHA]:
             self.assertTrue(
                 pfilter.letter in Passband.SYSTEM_LETTERS[pfilter.system])
Exemplo n.º 6
0
    def test_cmp(self):
        def assert_max(index, *names):
            """ Make sure that Passband(names[index]) is the largest item """
            pfilters = [Passband(x) for x in names]
            self.assertEqual(max(pfilters), pfilters[index])

        assert_max(1, "Johnson B", "Cousins R")
        assert_max(0, "SDSS Z", "Gunn U")
        assert_max(1, "Johnson V", "SDSS I")
        assert_max(0, "2MASS KS", "Johnson R")
        assert_max(1, "Cousins I", "2MASS J")
        assert_max(0, "Gunn G", "Stromgren B")

        def letter_index(letter):
            """ Return the position of a letter in Passband.LETTERS_ORDER """
            return Passband.LETTERS_ORDER.index(letter)

        # Now sort a series of lists of random Passband objects
        for _ in xrange(NITERS):

            pfilters = [Passband.random() for x in xrange(NPASSBANDS)]
            pfilters.sort()

            for index in xrange(0, len(pfilters) - 1):
                first = pfilters[index]
                second = pfilters[index + 1]
                ncustoms = sum(1 for p in [first, second]
                               if p.system == CUSTOM)
                nhalphas = sum(1 for p in [first, second]
                               if p.system == HALPHA)

                if not nhalphas and not ncustoms:
                    first_index = letter_index(first.letter)
                    second_index = letter_index(second.letter)
                    self.assertTrue(first_index <= second_index)
                    # If letters are equal, sort lexicographically by the system
                    if first.letter == second.letter:
                        self.assertTrue(first.system <= second.system)

                # Custom filters are smaller than others system
                elif ncustoms == 1:
                    first.system == CUSTOM
                    second.system != CUSTOM

                elif ncustoms == 2:
                    # Two custom filters are compared lexicographically
                    self.assertTrue(first.letter <= second.letter)

                # H-alpha filters are greater than other systems
                elif nhalphas == 1:
                    first.system != HALPHA
                    second.system == HALPHA

                else:
                    assert nhalphas == 2
                    self.assertTrue(int(first.letter) <= int(second.letter))
Exemplo n.º 7
0
    def test_cmp(self):

        def assert_max(index, *names):
            """ Make sure that Passband(names[index]) is the largest item """
            pfilters = [Passband(x) for x in names]
            self.assertEqual(max(pfilters), pfilters[index])

        assert_max(1, "Johnson B", "Cousins R")
        assert_max(0, "SDSS Z", "Gunn U")
        assert_max(1, "Johnson V", "SDSS I")
        assert_max(0, "2MASS KS", "Johnson R")
        assert_max(1, "Cousins I", "2MASS J")
        assert_max(0, "Gunn G", "Stromgren B")

        def letter_index(letter):
            """ Return the position of a letter in Passband.LETTERS_ORDER """
            return Passband.LETTERS_ORDER.index(letter)

        # Now sort a series of lists of random Passband objects
        for _ in xrange(NITERS):

            pfilters = [Passband.random() for x in xrange(NPASSBANDS)]
            pfilters.sort()

            for index in xrange(0, len(pfilters) - 1):
                first  = pfilters[index]
                second = pfilters[index + 1]
                ncustoms = sum(1 for p in [first, second] if p.system == CUSTOM)
                nhalphas = sum(1 for p in [first, second] if p.system == HALPHA)

                if not nhalphas and not ncustoms:
                    first_index  = letter_index(first.letter)
                    second_index = letter_index(second.letter)
                    self.assertTrue(first_index <= second_index)
                    # If letters are equal, sort lexicographically by the system
                    if first.letter == second.letter:
                        self.assertTrue(first.system <= second.system)

                # Custom filters are smaller than others system
                elif ncustoms == 1:
                    first.system  == CUSTOM
                    second.system != CUSTOM

                elif ncustoms == 2:
                    # Two custom filters are compared lexicographically
                    self.assertTrue(first.letter <= second.letter)

                # H-alpha filters are greater than other systems
                elif nhalphas == 1:
                    first.system  != HALPHA
                    second.system == HALPHA

                else:
                    assert nhalphas == 2
                    self.assertTrue(int(first.letter) <= int(second.letter))
Exemplo n.º 8
0
    def test_all(self):

        # Make sure that, except for H-alpha, all the photometric systems
        # and letters are present in the list returned by Passband.all()
        pfilters = Passband.all()
        # There must not be duplicate Passband objects
        self.assertEqual(len(pfilters), len(set(pfilters)))
        for system, letters in Passband.SYSTEM_LETTERS.iteritems():
            for letter in letters:
                name = "%s %s" % (system, letter)
                pfilter = Passband(name)
                self.assertIn(pfilter, pfilters)

        # No user-defined filter must be missing either
        for name in passband.CUSTOM_FILTERS.iterkeys():
            pfilter = Passband(name)
            self.assertIn(pfilter, pfilters)
Exemplo n.º 9
0
 def test_different(self):
     for _ in xrange(NITERS):
         pfilter = Passband.random()
         self.assertNotEqual(pfilter, pfilter.different())
Exemplo n.º 10
0
 def test_hash(self):
     for _ in xrange(NITERS):
         pfilter = Passband.random()
         self.assertEqual(hash(pfilter), hash(eval( ` pfilter `)))
         self.assertNotEqual(hash(pfilter), hash(pfilter.different()))
Exemplo n.º 11
0
 def assert_max(index, *names):
     """ Make sure that Passband(names[index]) is the largest item """
     pfilters = [Passband(x) for x in names]
     self.assertEqual(max(pfilters), pfilters[index])
Exemplo n.º 12
0
 def test_repr(self):
     for _ in xrange(NITERS):
         pfilter = Passband.random()
         self.assertEqual(pfilter, eval( ` pfilter `))
Exemplo n.º 13
0
 def test_repr(self):
     for _ in xrange(NITERS):
         pfilter = Passband.random()
         self.assertEqual(pfilter, eval(`pfilter`))
Exemplo n.º 14
0
 def test_custom_filters(self):
     for name, description in passband.CUSTOM_FILTERS.iteritems():
         pfilter = Passband(name)
         self.assertEqual(pfilter.system, CUSTOM)
         self.assertEqual(pfilter.letter, description)
Exemplo n.º 15
0
 def test_halpha_filters(self):
     data_file = self.get_data_path(HALPHA)
     for name, wavelength in self.read_filter_data_file(data_file):
         passband = Passband(name)
         self.assertEqual(passband.system, HALPHA)
         self.assertEqual(passband.letter, wavelength)
Exemplo n.º 16
0
 def test_different(self):
     for _ in xrange(NITERS):
         pfilter = Passband.random()
         self.assertNotEqual(pfilter, pfilter.different())
Exemplo n.º 17
0
 def test_hash(self):
     for _ in xrange(NITERS):
         pfilter = Passband.random()
         self.assertEqual(hash(pfilter), hash(eval(`pfilter`)))
         self.assertNotEqual(hash(pfilter), hash(pfilter.different()))