Repository: PlasmaPy/PlasmaPy

Issue:
Create Particle class method to return Roman numeral spectroscopic notation
Right now the `Particle` class accepts atoms and ions in Roman numeral notation (see #286 and #290 for details), where the Roman numeral after the atomic symbol represents the ionization level plus one:
```Python
>>> Particle("Fe XIII")
Particle("Fe 12+")
```
It would be helpful to have a `Particle` class attribute that would return the Roman numeral notation of `Particle` instances that are ions or neutral atoms.  
```Python
>>> Particle("Fe 12+").ionic_symbol_roman
'Fe XIII'
```
I'm not sure if `ionic_symbol_roman` would be the best method name; just using `roman` would be an alternative.  

This should only work for `Particle` instances where the integer charge is specified in order to be consistent with other parts of the class.  

Thanks!




Discussion:
[NIST calls](https://physics.nist.gov/PhysRefData/ASD/ionEnergy.html) the roman numeral version the "spectral name" and the integer version the "ion charge", if that helps

@lemmatum Can I work on this?
@manasbedmutha98 Yes, sure! Thanks!

Resolving patch:
diff --git a/plasmapy/atomic/particle_class.py b/plasmapy/atomic/particle_class.py
--- a/plasmapy/atomic/particle_class.py
+++ b/plasmapy/atomic/particle_class.py
@@ -4,6 +4,7 @@
 import warnings
 from typing import (Union, Set, Tuple, List, Optional)
 import collections
+import roman
 
 import astropy.units as u
 import astropy.constants as const
@@ -608,6 +609,37 @@ def ionic_symbol(self) -> Optional[str]:
         """
         return self._attributes['ion']
 
+    @property
+    def roman_symbol(self) -> Optional[str]:
+        """
+        Return the spectral name of the particle (i.e. the ionic symbol in
+        Roman numeral notation).  If the particle is not an ion or neutral
+        atom, return `None`. The roman numeral represents one plus the
+        integer charge. Raise `ChargeError` if no charge has been specified
+        and `roman.OutOfRangeError` if the charge is negative.
+
+        Examples
+        --------
+        >>> proton = Particle('proton')
+        >>> proton.roman_symbol
+        'H-1 II'
+        >>> hydrogen_atom = Particle('H', Z=0)
+        >>> hydrogen_atom.roman_symbol
+        'H I'
+
+        """
+        if not self._attributes['element']:
+            return None
+        if self._attributes['integer charge'] is None:
+            raise ChargeError(f"The charge of particle {self} has not been specified.")
+        if self._attributes['integer charge'] < 0:
+            raise roman.OutOfRangeError('Cannot convert negative charges to Roman.')
+
+        symbol = self.isotope if self.isotope else self.element
+        integer_charge = self._attributes['integer charge']
+        roman_charge = roman.toRoman(integer_charge + 1)
+        return f"{symbol} {roman_charge}"
+
     @property
     def element_name(self) -> str:
         """


Test patch:
diff --git a/plasmapy/atomic/tests/test_particle_class.py b/plasmapy/atomic/tests/test_particle_class.py
--- a/plasmapy/atomic/tests/test_particle_class.py
+++ b/plasmapy/atomic/tests/test_particle_class.py
@@ -2,6 +2,7 @@
 import numpy as np
 from astropy import units as u
 import inspect
+import roman
 
 from ...constants import m_p, m_e, m_n, e
 
@@ -31,6 +32,7 @@
       'element': None,
       'isotope': None,
       'ionic_symbol': None,
+      'roman_symbol': None,
       'is_ion': False,
       'is_electron': False,
       'integer_charge': 0,
@@ -50,6 +52,7 @@
       'element_name': 'hydrogen',
       'isotope': 'H-1',
       'ionic_symbol': 'p+',
+      'roman_symbol': 'H-1 II',
       'is_ion': True,
       'mass': m_p,
       'nuclide_mass': m_p,
@@ -83,6 +86,7 @@
       'element_name': InvalidElementError,
       'isotope': None,
       'ionic_symbol': None,
+      'roman_symbol': None,
       'is_ion': False,
       'mass': m_p,
       'integer_charge': -1,
@@ -103,6 +107,7 @@
       'element_name': InvalidElementError,
       'isotope': None,
       'ionic_symbol': None,
+      'roman_symbol': None,
       'is_ion': False,
       'mass': m_e,
       'integer_charge': -1,
@@ -125,6 +130,7 @@
       'element': None,
       'isotope': None,
       'ionic_symbol': None,
+      'roman_symbol': None,
       'is_ion': False,
       'mass': m_e,
       'nuclide_mass': InvalidIsotopeError,
@@ -151,6 +157,7 @@
       'element': 'H',
       'isotope': None,
       'ionic_symbol': None,
+      'roman_symbol': ChargeError,
       'is_ion': False,
       'charge': ChargeError,
       'integer_charge': ChargeError,
@@ -166,11 +173,31 @@
       'is_category("proton")': False,
       }),
 
+    ('H 1-', {},
+     {'particle': 'H 1-',
+      'element': 'H',
+      'isotope': None,
+      'ionic_symbol': 'H 1-',
+      'roman_symbol': roman.OutOfRangeError,
+      'is_ion': True,
+      'integer_charge': -1,
+      'mass_number': InvalidIsotopeError,
+      'baryon_number': MissingAtomicDataError,
+      'lepton_number': 0,
+      'half_life': InvalidIsotopeError,
+      'standard_atomic_weight': InvalidElementError,
+      'nuclide_mass': InvalidIsotopeError,
+      'is_category("charged")': True,
+      'is_category("nonmetal")': True,
+      'is_category("proton")': False,
+      }),
+
     ('H-1 0+', {}, {
         'particle': 'H-1 0+',
         'element': 'H',
         'isotope': 'H-1',
         'ionic_symbol': 'H-1 0+',
+        'roman_symbol': 'H-1 I',
         'is_ion': False,
         'charge': 0 * u.C,
         'integer_charge': 0,
@@ -192,6 +219,7 @@
       'element_name': 'hydrogen',
       'isotope': 'D',
       'ionic_symbol': 'D 1+',
+      'roman_symbol': 'D II',
       'is_ion': True,
       'integer_charge': 1,
       'atomic_number': 1,
@@ -211,6 +239,7 @@
       'element': 'H',
       'isotope': 'T',
       'ionic_symbol': 'T 1+',
+      'roman_symbol': 'T II',
       'is_ion': True,
       'integer_charge': 1,
       'atomic_number': 1,
@@ -229,6 +258,7 @@
       'element_name': 'iron',
       'isotope': 'Fe-56',
       'ionic_symbol': 'Fe-56 17+',
+      'roman_symbol': 'Fe-56 XVIII',
       'is_electron': False,
       'is_ion': True,
       'integer_charge': 17,
@@ -248,6 +278,7 @@
       'element_name': 'helium',
       'isotope': 'He-4',
       'ionic_symbol': 'He-4 2+',
+      'roman_symbol': 'He-4 III',
       'is_ion': True,
       'integer_charge': 2,
       'atomic_number': 2,
@@ -263,6 +294,7 @@
       'element_name': 'lithium',
       'isotope': 'Li-7',
       'ionic_symbol': None,
+      'roman_symbol': ChargeError,
       'is_ion': False,
       'integer_charge': ChargeError,
       'atomic_number': 3,
@@ -278,6 +310,7 @@
       'element': 'Cn',
       'isotope': 'Cn-276',
       'ionic_symbol': 'Cn-276 22+',
+      'roman_symbol': 'Cn-276 XXIII',
       'is_ion': True,
       'element_name': 'copernicium',
       'integer_charge': 22,
@@ -292,6 +325,7 @@
       'element': None,
       'isotope': None,
       'ionic_symbol': None,
+      'roman_symbol': None,
       'is_ion': False,
       'integer_charge': -1,
       'atomic_number': InvalidElementError,