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,35 @@ 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`.
+
+        Examples
+        --------
+        >>> proton = Particle('proton')
+        >>> proton.roman_symbol
+        'H 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.')
+
+        element = self._attributes['element']
+        integer_charge = self._attributes['integer charge']
+        roman_charge = roman.toRoman(integer_charge + 1)
+        return element + ' ' + 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 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,
@@ -171,6 +178,7 @@
         'element': 'H',
         'isotope': 'H-1',
         'ionic_symbol': 'H-1 0+',
+        'roman_symbol': 'H I',
         'is_ion': False,
         'charge': 0 * u.C,
         'integer_charge': 0,
@@ -192,6 +200,7 @@
       'element_name': 'hydrogen',
       'isotope': 'D',
       'ionic_symbol': 'D 1+',
+      'roman_symbol': 'H II',
       'is_ion': True,
       'integer_charge': 1,
       'atomic_number': 1,
@@ -211,6 +220,7 @@
       'element': 'H',
       'isotope': 'T',
       'ionic_symbol': 'T 1+',
+      'roman_symbol': 'H II',
       'is_ion': True,
       'integer_charge': 1,
       'atomic_number': 1,
@@ -229,6 +239,7 @@
       'element_name': 'iron',
       'isotope': 'Fe-56',
       'ionic_symbol': 'Fe-56 17+',
+      'roman_symbol': 'Fe XVIII',
       'is_electron': False,
       'is_ion': True,
       'integer_charge': 17,
@@ -248,6 +259,7 @@
       'element_name': 'helium',
       'isotope': 'He-4',
       'ionic_symbol': 'He-4 2+',
+      'roman_symbol': 'He III',
       'is_ion': True,
       'integer_charge': 2,
       'atomic_number': 2,
@@ -263,6 +275,7 @@
       'element_name': 'lithium',
       'isotope': 'Li-7',
       'ionic_symbol': None,
+      'roman_symbol': ChargeError,
       'is_ion': False,
       'integer_charge': ChargeError,
       'atomic_number': 3,
@@ -278,6 +291,7 @@
       'element': 'Cn',
       'isotope': 'Cn-276',
       'ionic_symbol': 'Cn-276 22+',
+      'roman_symbol': 'Cn XXIII',
       'is_ion': True,
       'element_name': 'copernicium',
       'integer_charge': 22,
@@ -292,6 +306,7 @@
       'element': None,
       'isotope': None,
       'ionic_symbol': None,
+      'roman_symbol': None,
       'is_ion': False,
       'integer_charge': -1,
       'atomic_number': InvalidElementError,