Repository: radis/radis (language: python)

Issue:
Bug Report: Fetch exomol
### 🐛 Describe the bug

The following code produces an error:
```python
from radis.io.exomol import fetch_exomol

df_exomol = fetch_exomol("CO2", output="vaex", 
                         verbose = 0, 
                         load_wavenum_min=2000, load_wavenum_max=2500,
                         )
```
output:
```
Background atmosphere:  Air
Reading C:\Users\Nicolas Minesi\.radisdb\exomol\CO2\12C-16O2\UCL-4000\12C-16O2__UCL-4000__02000-03000.trans.bz2
.broad is used.
Broadening code level= a0
Traceback (most recent call last):

  File C:\Anaconda\lib\site-packages\spyder_kernels\py3compat.py:356 in compat_exec
    exec(code, globals, locals)

  File c:\users\nicolas minesi\python\radis\io\untitled8.py:10
    df_exomol = fetch_exomol("CO2", output="vaex",

  File c:\users\nicolas minesi\python\radis\io\exomol.py:264 in fetch_exomol
    mdb.set_broadening(df, output=output)

  File c:\users\nicolas minesi\python\radis\api\exomolapi.py:1315 in set_broadening
    self.compute_broadening(

  File c:\users\nicolas minesi\python\radis\api\exomolapi.py:1360 in compute_broadening
    jlower_max=np.max(jlower),

  File <__array_function__ internals>:200 in amax

  File C:\Anaconda\lib\site-packages\numpy\core\fromnumeric.py:2820 in amax
    return _wrapreduction(a, np.maximum, 'max', axis, None, out,

  File C:\Anaconda\lib\site-packages\numpy\core\fromnumeric.py:84 in _wrapreduction
    return reduction(axis=axis, out=out, **passkwargs)

TypeError: max() got an unexpected keyword argument 'axis'
```

### 💡 Possible solutions

Inspecting the file, I found several problems, mostly relating to the calculation of the broadening parameter (gamma and N) in the [compute_broadening](https://github.com/radis/radis/blob/0b87b6f9e0541fce9f6c9e8b7be30ffefbdd3c30/radis/api/exomolapi.py#L1326) function of `exomol.api`:

- [ ] First of all, the name of the functions is confusing. The actual pressure broadening FWHM is not calculated here. Only the broadening coefficients are calculated. 
- [ ] The handling of the exception is not well organized. A very large `try` `except` is employed. This should be avoided as much as possible.
- [ ] It is not possible to ask for another broadener than "air". 
- [ ] `verbose=0` has no impact on the print. 
- [ ] in the specific case of CO2, the above error is raised because the Dataframe is in `vaex` format (instead of Pandas historically)

@1someshverma and @menasrac, since you are working on databases, do not hesitate to report related problems you might face during your GSOC. I will try to work on this next week.

### 🎲 Radis version

0.14

### 💻 Operating system

Windows
Integrals based on wavelength differs from integrals based on wavenum by a factor of 1.00027
Original comment from @AllanHOlesenBW  


---

**Integrals based on wavelength differs from inte

> grals based on wavenum by a factor of 1.00027.**
> At first, I thought that this was just a numerical error in the integrals. But it seems very consistent. And the error is suspiciously close to the refraction index for air.
> 
> An example of this can be seen in bug #454 where @erwanp performs a check of integrals after conversions of emisscoeff, based on wavenum and wavelength:
> 
> > Also checking that the integral is properly conserved in both cases :
> > 
> > 0.001534377339562196
> > 0.0015347955335563383
> 
> These two numbers are actually different by a factor of 1.00027
> 
> A demonstration example:
> 
> ```
> from radis import calc_spectrum
> s = calc_spectrum(1900, 2300, # cm-1
>         molecule='CO',
>         isotope='1,2,3',
>         pressure=1.01325, # bar
>         Tgas=700, # K
>         mole_fraction=0.1,
>         path_length=1, # cm
>         databank='hitran', # or use 'hitemp'
>     )
> 
> print('Wave unit:    ', s.get_waveunit())
> print('Radiance unit:', s.units['radiance'])
> 
> print('Testing different methods of integrating the radiance over the full spectrum.')
> print()
> print('First the specific built-in method, Spectrum.get_power()')
> print('This uses an internal rescaling of waveunit to nm to get a meaningful integral:')
> power1 = s.get_power(unit='W/m2/sr')
> print(power1)
> 
> print()
> print('Replicate this using the generic built-in integration method, also converting to wavelength:')
> power2 = s.get_integral("radiance_noslit", wunit="nm", Iunit="W/m2/sr/nm")
> print(power2)
> print('Ratio between this result and get_power()', power2/power1)
> 
> print()
> print('Do the same, but this time maintain the wavenum based units:')
> power3 = s.get_integral("radiance_noslit", wunit="cm-1", Iunit="W/m2/sr/cm-1")
> print(power3)
> print('Ratio between this result and get_power()', power3/power1)
> 
> print()
> print('Test again with wavelength base, but this time use nm_vac as wunit:')
> power4 = s.get_integral("radiance_noslit", wunit="nm_vac", Iunit="W/m2/sr/nm")
> print(power4)
> print('Ratio between this result and get_power()', power4/power1)
> ```
> 
> I would expect that if I specify wunit="nm", Iunit="W/m2/sr/nm" in an integral, then those nm are the same type of nanometers, either vacuum based or air based. 
> 
> And if I specify wunit="cm-1", Iunit="W/m2/sr/cm-1", I expect those to be the same type of wavenums, either vacuum based or air based.
> 
> Something clearly deviates  from this expectation since I get different results, but I am not sure which of the results are correct.

_Originally posted by @AllanHOlesenBW in https://github.com/radis/radis/issues/215#issuecomment-1112985821_
Bug Report: ValueError in _is_at_equilibrium() due to Tvib not being float
### 🐛 Describe the bug

I’m trying to write a fitting routine for CO2 using `lmfit` and stumbled upon a ValueError being raised in `calc.py`, `_is_at_equilibrium()`.

```error
~\AppData\Local\Programs\Python\Python39\lib\site-packages\radis\lbl\calc.py in _is_at_equilibrium()
    642     def _is_at_equilibrium():
    643         try:
--> 644             assert Tvib is None or Tvib == Tgas
    645             assert Trot is None or Trot == Tgas
    646             assert overpopulation is None

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
```

In this line `Tvib` - a tuple of floats - is getting compared to a float hence raising this error.

### 💡 Possible solutions

 I assume that this line should not have be raised to start with but for now I avoid this error by writing 


```python
assert Tvib is None or (min(Tvib) == Tgas and max(Tvib) == Tgas)

```

therefore, checking for equilibrium within `Tvib` and to `Trot.`

### 🎲 Radis version

0.13.1

### 💻 Operating system

Windows
organized verbose message of hitemp
### Description / Old version
The `fetch_database` of HITEMP was a bit messy, displaying several times the same or different outputs (even if `verbose=0`. For instance:
```python
from radis.io.hitemp import fetch_hitemp
df = fetch_hitemp("CO2", output="vaex", verbose = 0,
                  load_wavenum_min=2400, load_wavenum_max=2500,
                  )
```
produced:
```
HITEMP keep only relevant input files: ['C:\\Users\\Nicolas Minesi\\.radisdb\\hitemp\\CO2-02_02250-02500_HITEMP2010.hdf5']
HITEMP keep only relevant input files: []
HITEMP keep only relevant input files: ['C:\\Users\\Nicolas Minesi\\.radisdb\\hitemp\\CO2-02_02250-02500_HITEMP2010.hdf5']
```

### New version
Now the print is shown only once and more is organized if multiple files are loaded:
```python
from radis.io.hitemp import fetch_hitemp
df = fetch_hitemp("CO2", output="vaex", verbose = 1,
                  load_wavenum_min=2000, load_wavenum_max=2500,
                  )
```
```
In ``C:\Users\Nicolas Minesi\.radisdb\hitemp`` keep only relevant input files:
CO2-02_02000-02125_HITEMP2010.hdf5
CO2-02_02125-02250_HITEMP2010.hdf5
CO2-02_02250-02500_HITEMP2010.hdf5
```
If a new file needs to be downloaded, the print is coherent as well:
```
Downloading 02_01500-02000_HITEMP2010.zip for CO2 (1/1).
Download complete. Parsing CO2 database to C:\Users\Nicolas Minesi\.radisdb\hitemp\CO2-02_01500-02000_HITEMP2010.hdf5
In ``C:\Users\Nicolas Minesi\.radisdb\hitemp`` keep only relevant input files:
CO2-02_01500-02000_HITEMP2010.hdf5
CO2-02_02000-02125_HITEMP2010.hdf5
CO2-02_02125-02250_HITEMP2010.hdf5
CO2-02_02250-02500_HITEMP2010.hdf5
```
Docs are broken
## Error 1 

### 🐛 Describe the bug

Docs are broken : https://readthedocs.org/projects/radis/builds/19302835/ 

Apparently due to missing test file : `FileNotFoundError: Test file `trimmed_1857_VoigtCO_Minesi.mat` does not exist`

```

Extension error:
Here is a summary of the problems encountered when running the examples

Unexpected failing examples:
/home/docs/checkouts/readthedocs.org/user_builds/radis/checkouts/develop/examples/plot_compare_CO_geisa_hitran.py failed leaving traceback:
Traceback (most recent call last):
  File "/home/docs/checkouts/readthedocs.org/user_builds/radis/checkouts/develop/examples/plot_compare_CO_geisa_hitran.py", line 37, in <module>
    s_geisa = calc_spectrum(**conditions, databank="geisa", name="GEISA's CO")
  File "/home/docs/checkouts/readthedocs.org/user_builds/radis/envs/develop/lib/python3.8/site-packages/radis/lbl/calc.py", line 534, in calc_spectrum
    generated_spectrum = _calc_spectrum_one_molecule(
  File "/home/docs/checkouts/readthedocs.org/user_builds/radis/envs/develop/lib/python3.8/site-packages/radis/lbl/calc.py", line 800, in _calc_spectrum_one_molecule
    sf.fetch_databank(**conditions)
  File "/home/docs/checkouts/readthedocs.org/user_builds/radis/envs/develop/lib/python3.8/site-packages/radis/lbl/loader.py", line 1364, in fetch_databank
    df, local_paths = fetch_geisa(
  File "/home/docs/checkouts/readthedocs.org/user_builds/radis/envs/develop/lib/python3.8/site-packages/radis/io/geisa.py", line 174, in fetch_geisa
    df = ldb.load(
TypeError: load() got an unexpected keyword argument 'isotope'


/home/docs/checkouts/readthedocs.org/user_builds/radis/checkouts/develop/examples/plot_newfitting_Tgas-molfrac.py failed leaving traceback:
Traceback (most recent call last):
  File "/home/docs/checkouts/readthedocs.org/user_builds/radis/checkouts/develop/examples/plot_newfitting_Tgas-molfrac.py", line 35, in <module>
    data = scipy.io.loadmat(getTestFile(data_file), simplify_cells=True)["CO_resu_Voigt"]
  File "/home/docs/checkouts/readthedocs.org/user_builds/radis/envs/develop/lib/python3.8/site-packages/radis/test/utils.py", line 77, in getTestFile
    raise FileNotFoundError(
FileNotFoundError: Test file `trimmed_1857_VoigtCO_Minesi.mat` does not exist. Choose one of: 
- hitran_CO_fragment.par
- geisa_CO2_fragment.par
- co2_cdsd_hamiltonian_fragment.levels
- CO_Tgas1500K_mole_fraction0.01.spec
- geisa_CO_fragment.par
- hitran_co2_626_bandhead_4165_4200nm.par
- hitran_co_3iso_2000_2300cm.h5
- cdsd_hitemp_09_fragment.txt
- geisa_O2_fragment.par
- calc_N2C_spectrum_Trot1200_Tvib3000_slit0.1.txt
- synth-NH3-1-500-2000cm-P10-mf0.01-p1.spec
- hitran_co2_626_bandhead_4165_4200nm.h5
- CO_Tgas1500K_mole_fraction0.5.spec
- Corentin_0_100cm_DownSampled_20cm_10pctCO2_1-wc-gw450-gr300-sl1500-acc5000-.spec
- hitran_2016_H2O_2iso_2000_2100cm.par
- hitran_co_3iso_2000_2300cm.par
- hitran_CO2_fragment.par
- geisa_H2O_fragment.par
- N2C_specair_380nm.spec
- CO2abscoeff_300K_4150_4400nm.txt
- slitfunction.txt
- cdsd_hitemp_09_fragment.h5
- CO2_measured_spectrum_4-5um.spec
- cdsd_hitemp_09_header.txt
- SpecDatabase_Test
- calc_N2C_spectrum_Trot1200_Tvib3000.txt or use force=True
```

### 💡 Possible solutions

@TranHuuNhatHuy you added this test file  (it does appear in https://github.com/radis/radis/tree/develop/radis/test/files ) . However to appear in the Docs it should also be included in the [MANIFEST.in](https://github.com/radis/radis/blob/develop/MANIFEST.in) file. 

Easy fix

### 🎲 Radis version

latest 

### 💻 Operating system

Windows



---

## Error 2 

There is also another error : 

```

Unexpected failing examples:
/home/docs/checkouts/readthedocs.org/user_builds/radis/checkouts/develop/examples/plot_compare_CO_geisa_hitran.py failed leaving traceback:
Traceback (most recent call last):
  File "/home/docs/checkouts/readthedocs.org/user_builds/radis/checkouts/develop/examples/plot_compare_CO_geisa_hitran.py", line 37, in <module>
    s_geisa = calc_spectrum(**conditions, databank="geisa", name="GEISA's CO")
  File "/home/docs/checkouts/readthedocs.org/user_builds/radis/envs/develop/lib/python3.8/site-packages/radis/lbl/calc.py", line 534, in calc_spectrum
    generated_spectrum = _calc_spectrum_one_molecule(
  File "/home/docs/checkouts/readthedocs.org/user_builds/radis/envs/develop/lib/python3.8/site-packages/radis/lbl/calc.py", line 800, in _calc_spectrum_one_molecule
    sf.fetch_databank(**conditions)
  File "/home/docs/checkouts/readthedocs.org/user_builds/radis/envs/develop/lib/python3.8/site-packages/radis/lbl/loader.py", line 1364, in fetch_databank
    df, local_paths = fetch_geisa(
  File "/home/docs/checkouts/readthedocs.org/user_builds/radis/envs/develop/lib/python3.8/site-packages/radis/io/geisa.py", line 174, in fetch_geisa
    df = ldb.load(
TypeError: load() got an unexpected keyword argument 'isotope'
```
Compute power based on vacuum wavelengths - Resolution proposal for bug #460
<!-- Please be sure to check out our contributing guidelines,
https://github.com/radis/radis/blob/develop/CONTRIBUTING.md . -->

### Description
<!-- Provide a general description of what your pull request does. -->

This pull request is to address the wavelength problem described in bug #460.

<!-- If the pull request closes any open issues you can add this.
If you replace <Issue Number> with a number, GitHub will automatically link it.
If this pull request is unrelated to any issues, please remove
the following line. -->

Fixes #460 

Integrals based on wavelength differs from integrals based on wavenum by a factor of 1.00027
Original comment from @AllanHOlesenBW  


---

**Integrals based on wavelength differs from inte

> grals based on wavenum by a factor of 1.00027.**
> At first, I thought that this was just a numerical error in the integrals. But it seems very consistent. And the error is suspiciously close to the refraction index for air.
> 
> An example of this can be seen in bug #454 where @erwanp performs a check of integrals after conversions of emisscoeff, based on wavenum and wavelength:
> 
> > Also checking that the integral is properly conserved in both cases :
> > 
> > 0.001534377339562196
> > 0.0015347955335563383
> 
> These two numbers are actually different by a factor of 1.00027
> 
> A demonstration example:
> 
> ```
> from radis import calc_spectrum
> s = calc_spectrum(1900, 2300, # cm-1
>         molecule='CO',
>         isotope='1,2,3',
>         pressure=1.01325, # bar
>         Tgas=700, # K
>         mole_fraction=0.1,
>         path_length=1, # cm
>         databank='hitran', # or use 'hitemp'
>     )
> 
> print('Wave unit:    ', s.get_waveunit())
> print('Radiance unit:', s.units['radiance'])
> 
> print('Testing different methods of integrating the radiance over the full spectrum.')
> print()
> print('First the specific built-in method, Spectrum.get_power()')
> print('This uses an internal rescaling of waveunit to nm to get a meaningful integral:')
> power1 = s.get_power(unit='W/m2/sr')
> print(power1)
> 
> print()
> print('Replicate this using the generic built-in integration method, also converting to wavelength:')
> power2 = s.get_integral("radiance_noslit", wunit="nm", Iunit="W/m2/sr/nm")
> print(power2)
> print('Ratio between this result and get_power()', power2/power1)
> 
> print()
> print('Do the same, but this time maintain the wavenum based units:')
> power3 = s.get_integral("radiance_noslit", wunit="cm-1", Iunit="W/m2/sr/cm-1")
> print(power3)
> print('Ratio between this result and get_power()', power3/power1)
> 
> print()
> print('Test again with wavelength base, but this time use nm_vac as wunit:')
> power4 = s.get_integral("radiance_noslit", wunit="nm_vac", Iunit="W/m2/sr/nm")
> print(power4)
> print('Ratio between this result and get_power()', power4/power1)
> ```
> 
> I would expect that if I specify wunit="nm", Iunit="W/m2/sr/nm" in an integral, then those nm are the same type of nanometers, either vacuum based or air based. 
> 
> And if I specify wunit="cm-1", Iunit="W/m2/sr/cm-1", I expect those to be the same type of wavenums, either vacuum based or air based.
> 
> Something clearly deviates  from this expectation since I get different results, but I am not sure which of the results are correct.

_Originally posted by @AllanHOlesenBW in https://github.com/radis/radis/issues/215#issuecomment-1112985821_
Fix docs and various little things
- fix GEISA and upload .mat test file. This should fix docs #545
- fix test after power calculation correction in #477 (to fix #460)
- refactor : rename lbl/test_spectrum to avoid confusion with spectrum/test_spectrum
- fix Travis-CI badge on README





Discussion / hints:

See answer https://github.com/radis/radis/issues/215#issuecomment-1113174801
@AllanHOlesenBW do you want to update the RADIS defaults to get a consistent get_power() output ? 
Are you asking if I will perform the actual code change? Or are you just asking me on my opinion on whether the code should be  changed?

Re. the latter, I am a bit in deep water, as I do not have enough knowledge about other users' use cases. 

For my own use case, I would prefer the equivalent of power3 or power4 in the example code above.

However, as far as I have understood from #215, a Radis Spectrum object has no knowledge of whether it originated from air or vacuum. So I wonder if there are other use cases, where the current behaviour, equivalent to power2 above, is actually the correct one, because the radiance was based on air, not vacuum.
Hello, would be great if you could implement it. Your way is strongly supported by your arguments. Even if spectrum was computed in air; the notion of get_power() refers to an energy flux; not to how the spectra are observed; therefore shouldnt be medium-dependant

Implementation wise, it should be as simple as changing [spectrum.py](https://github.com/radis/radis/blob/develop/radis/spectrum/spectrum.py#L1734) from `self.get_integral("radiance_noslit", wunit="nm", Iunit="mW/cm2/sr/nm")` to `self.get_integral("radiance_noslit", wunit="nm_vac", Iunit="mW/cm2/sr/nm")` or `self.get_integral("radiance_noslit", wunit="cm-1", Iunit="mW/cm2/sr/cm-1")`
I will take this task. Just need some time to figure out the github mechanics. This will be the first time I have have contributed to any project on a version control server.
Great! We can help with the technical points of versioning etc. 




See answer https://github.com/radis/radis/issues/215#issuecomment-1113174801
@AllanHOlesenBW do you want to update the RADIS defaults to get a consistent get_power() output ? 
Are you asking if I will perform the actual code change? Or are you just asking me on my opinion on whether the code should be  changed?

Re. the latter, I am a bit in deep water, as I do not have enough knowledge about other users' use cases. 

For my own use case, I would prefer the equivalent of power3 or power4 in the example code above.

However, as far as I have understood from #215, a Radis Spectrum object has no knowledge of whether it originated from air or vacuum. So I wonder if there are other use cases, where the current behaviour, equivalent to power2 above, is actually the correct one, because the radiance was based on air, not vacuum.
Hello, would be great if you could implement it. Your way is strongly supported by your arguments. Even if spectrum was computed in air; the notion of get_power() refers to an energy flux; not to how the spectra are observed; therefore shouldnt be medium-dependant

Implementation wise, it should be as simple as changing [spectrum.py](https://github.com/radis/radis/blob/develop/radis/spectrum/spectrum.py#L1734) from `self.get_integral("radiance_noslit", wunit="nm", Iunit="mW/cm2/sr/nm")` to `self.get_integral("radiance_noslit", wunit="nm_vac", Iunit="mW/cm2/sr/nm")` or `self.get_integral("radiance_noslit", wunit="cm-1", Iunit="mW/cm2/sr/cm-1")`
I will take this task. Just need some time to figure out the github mechanics. This will be the first time I have have contributed to any project on a version control server.
Great! We can help with the technical points of versioning etc. 


Fix patch:
diff --git a/MANIFEST.in b/MANIFEST.in
index d0fb139a9..0b4d74508 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -6,6 +6,7 @@ include radis/lbl/gpu.h
 include radis/phys/units.txt
 include radis/test/files/*.txt
 include radis/test/files/*.spec
+include radis/test/files/*.mat
 include radis/test/files/*.par
 include radis/test/files/*.levels
 include radis/db/molparam.txt
diff --git a/README.rst b/README.rst
index f1f97e59f..e0d5c4cf9 100644
--- a/README.rst
+++ b/README.rst
@@ -320,8 +320,8 @@ See `awesome-spectra <https://github.com/erwanp/awesome-spectra>`__   |badge_awe
                    :target: ./License.md
                    :alt: License
 
-.. |badge_travis| image:: https://img.shields.io/travis/radis/radis.svg
-                  :target: https://travis-ci.com/radis/radis
+.. |badge_travis| image:: https://app.travis-ci.com/radis/radis.svg?branch=develop
+                  :target: https://app.travis-ci.com/github/radis/radis
                   :alt: Tests
 
 .. |badge_coverage| image:: https://codecov.io/gh/radis/radis/branch/develop/graph/badge.svg
diff --git a/radis/api/exomolapi.py b/radis/api/exomolapi.py
index e6381fbdf..8cf389cb0 100644
--- a/radis/api/exomolapi.py
+++ b/radis/api/exomolapi.py
@@ -223,7 +223,7 @@ def read_trans(transf, engine="vaex"):
                 )
             except Exception as err:
                 raise Exception(
-                    f"Error reading {transf}. Maybe the file was corrupted during download ? You can try to delete it."
+                    f"Error reading {transf}. Either the file does not exist on exomol.com, or was corrupted? You can try to delete it."
                 ) from err
     elif engine == "csv":
         try:  # bz2 compression
@@ -240,7 +240,7 @@ def read_trans(transf, engine="vaex"):
                 )
             except Exception as err:
                 raise Exception(
-                    f"Error reading {transf}. Maybe the file was corrupted during download ? You can try to delete it."
+                    f"Error reading {transf}. Either the file does not exist on exomol.com, or was corrupted? You can try to delete it."
                 ) from err
     else:
         raise NotImplementedError(engine)
@@ -365,7 +365,7 @@ def read_states(
 
             except Exception as err:
                 raise Exception(
-                    f"Error reading {statesf}. Maybe the file was corrupted during download ? You can try to delete it."
+                    f"Error reading {statesf}. Either the file does not exist on exomol.com, or was corrupted? You can try to delete it."
                 ) from err
     elif engine == "csv":
         try:
@@ -583,24 +583,32 @@ def make_j2b(bdat, alpha_ref_default=0.07, n_Texp_default=0.5, jlower_max=None):
     alpha_ref_arr = np.array(bdat["alpha_ref"][cmask])
     n_Texp_arr = np.array(bdat["n_Texp"][cmask])
 
+    # Determine the array size based on jlower_max
     if jlower_max is None:
         Nblower = np.max(jlower_arr) + 1
     else:
         Nblower = np.max([jlower_max, np.max(jlower_arr)]) + 1
-    j2alpha_ref = np.ones(Nblower) * alpha_ref_default
-    j2n_Texp = np.ones(Nblower) * n_Texp_default
 
+    # Initialize arrays with default alpha_ref and n_Texp
+    j2alpha_ref = np.full(Nblower, alpha_ref_default)
+    j2n_Texp = np.full(Nblower, n_Texp_default)
+
+    # Populate the mapping arrays using known broadening coefficients
     j2alpha_ref[jlower_arr] = alpha_ref_arr
     j2n_Texp[jlower_arr] = n_Texp_arr
 
-    Ndef = Nblower - (np.max(jlower_arr) + 1)
-    if Ndef > 0:
-        print(
-            "default broadening parameters are used for ",
-            Ndef,
-            " J lower states in ",
-            Nblower,
-            " states",
+    # Raise a minor warning if default values are used for high J values
+    if Nblower > (np.max(jlower_arr) + 1):
+        import warnings
+
+        from radis.misc.warning import AccuracyWarning
+
+        warnings.warn(
+            AccuracyWarning(
+                "The default broadening parameter (alpha = {2} cm^-1 and n = {3}) are used for J'' > {1} up to J'' = {0}".format(
+                    Nblower, np.max(jlower_arr), alpha_ref_default, n_Texp_default
+                )
+            )
         )
 
     return j2alpha_ref, j2n_Texp
@@ -1076,7 +1084,7 @@ def __init__(
         nurange=[0.0, np.inf],
         margin=0.0,
         crit=-np.inf,
-        bkgdatm="Air",  # TODO: use Air whenever possible, to be consistent with HITRAN/HITEMP
+        bkgdatm="Air",  # TODO: use Air whenever possible (consistent with HITRAN/HITEMP). This is not a parameter for the moment.
         broadf=True,
         engine="vaex",
         verbose=True,
@@ -1105,8 +1113,7 @@ def __init__(
 
         t0 = self.path.parents[0].stem
         molec = t0 + "__" + str(self.path.stem)
-        self.bkgdatm = bkgdatm
-        print("Background atmosphere: ", self.bkgdatm)
+        self.bkgdatm = bkgdatm  # TODO: for the moment, only air is possible in RADIS, although He and H are usually available in ExoMol
         molecbroad = t0 + "__" + self.bkgdatm
 
         self.crit = crit
@@ -1165,7 +1172,7 @@ def __init__(
         # load states
         mgr = self.get_datafile_manager()
         if cache == "regen" and mgr.cache_file(self.states_file).exists():
-            if verbose:
+            if self.verbose:
                 print("Removing existing file ", mgr.cache_file(self.states_file))
             os.remove(mgr.cache_file(self.states_file))
         if mgr.cache_file(self.states_file).exists():
@@ -1237,14 +1244,28 @@ def __init__(
                 self.trans_file.append(trans_file)
                 self.num_tag.append(dic_def["numtag"][i])
 
+        # some verbose
+        if self.verbose:
+            print("Molecule: ", molecule)
+            print("Isotopologue: ", self.isotope_fullname)
+            print("Background atmosphere: ", self.bkgdatm)
+            print("ExoMol database: ", database)
+            print("Local folder: ", self.path)
+            print("Transition files: ")
+
         # Look-up missing parameters and write file
         # -----------------------------------------
-
         for trans_file, num_tag in zip(self.trans_file, self.num_tag):
-            print("Reading", trans_file)
+            if self.verbose:
+                print(
+                    "\t => File {}".format(
+                        os.path.splitext(os.path.basename((trans_file)))[0]
+                    )
+                )
+
             if cache == "regen" and mgr.cache_file(trans_file).exists():
-                if verbose:
-                    print("Removing existing file ", mgr.cache_file(trans_file))
+                if self.verbose:
+                    print("\t\t => `regen = True`. Removing the file")
                 os.remove(mgr.cache_file(trans_file))
 
             if not mgr.cache_file(trans_file).exists():
@@ -1255,14 +1276,15 @@ def __init__(
 
                 if not trans_file.exists():
                     self.download(molec, extension=[".trans.bz2"], numtag=num_tag)
-                    # TODO: add option to delete file at the end
-
-                print(
-                    f"Note: Caching line transition data to the {engine} format. After the second time, it will become much faster."
-                )
+                if self.verbose:
+                    print(
+                        f"\t\t => Caching the *.trans.bz2 file to the {engine} (*.h5) format. After the second time, it will become much faster."
+                    )
+                    print(f"\t\t => You can deleted the 'trans.bz2' file by hand.")
                 trans = read_trans(
                     trans_file, engine="vaex" if engine == "vaex" else "csv"
                 )
+                # TODO: add option to delete file at the end
 
                 # Complete transition data with lookup on upper & lower state :
                 # In particular, compute gup and elower
@@ -1293,12 +1315,7 @@ def __init__(
 
                 mgr.write(mgr.cache_file(trans_file), trans)
 
-        # Database ready to be loaded.
-        # Proceed with mdb.load()
-        # self.set_broadening()
-        #
-
-    def set_broadening(self, df, alpha_ref_def=None, n_Texp_def=None, output=None):
+    def set_broadening_coef(self, df, alpha_ref_def=None, n_Texp_def=None, output=None):
         """setting broadening parameters
 
         Parameters
@@ -1311,34 +1328,6 @@ def set_broadening(self, df, alpha_ref_def=None, n_Texp_def=None, output=None):
         -------
         None. Store values in Data Frame.
 
-        """
-        self.compute_broadening(
-            jlower=df["jlower"],
-            jupper=df["jupper"],
-            alpha_ref_def=alpha_ref_def,
-            n_Texp_def=n_Texp_def,
-            output=output,
-        )
-        # Add values
-        self.add_column(df, "alpha_ref", self.alpha_ref)
-        self.add_column(df, "n_Texp", self.n_Texp)
-
-    def compute_broadening(
-        self, jlower, jupper, alpha_ref_def=None, n_Texp_def=None, output=None
-    ):
-        """computing broadening parameters
-
-        Parameters
-        ----------
-        jlower: jlower array
-        jupper: jupper array
-        alpha_ref: set default alpha_ref and apply it. None=use self.alpha_ref_def
-        n_Texp_def: set default n_Texp and apply it. None=use self.n_Texp_def
-
-        Returns
-        -------
-        None. Store values in self.n_Texp and self.alpha_ref.
-
         """
 
         if alpha_ref_def:
@@ -1348,45 +1337,60 @@ def compute_broadening(
 
         if self.broadf:
             try:
-                print(".broad is used.")
                 bdat = read_broad(self.broad_file)
+                if self.verbose > 1:
+                    print(
+                        "The file `{}` is used.".format(
+                            os.path.basename(self.broad_file)
+                        )
+                    )
+            except FileNotFoundError:
+                warnings.warn(
+                    "Could not load `{}`. The default broadening parameters are used.\n".format(
+                        os.path.basename(self.broad_file)
+                    )
+                )
+
+                self.alpha_ref = np.array(
+                    self.alpha_ref_def * np.ones_like(df["jlower"])
+                )
+                self.n_Texp = np.array(self.n_Texp_def * np.ones_like(df["jlower"]))
+            else:
                 codelv = check_bdat(bdat)
-                print("Broadening code level=", codelv)
+                if self.verbose:
+                    print("Broadening code level:", codelv)
                 if codelv == "a0":
                     j2alpha_ref, j2n_Texp = make_j2b(
                         bdat,
                         alpha_ref_default=self.alpha_ref_def,
                         n_Texp_default=self.n_Texp_def,
-                        jlower_max=np.max(jlower),
+                        jlower_max=df["jlower"].max(),
                     )
-                    self.alpha_ref = np.array(j2alpha_ref[jlower])
-                    self.n_Texp = np.array(j2n_Texp[jlower])
+                    self.alpha_ref = j2alpha_ref[df["jlower"].values]
+                    self.n_Texp = j2n_Texp[df["jlower"].values]
                 elif codelv == "a1":
                     j2alpha_ref, j2n_Texp = make_j2b(
                         bdat,
                         alpha_ref_default=self.alpha_ref_def,
                         n_Texp_default=self.n_Texp_def,
-                        jlower_max=np.max(jlower),
+                        jlower_max=np.max(df["jlower"]),
                     )
                     jj2alpha_ref, jj2n_Texp = make_jj2b(
                         bdat,
                         j2alpha_ref_def=j2alpha_ref,
                         j2n_Texp_def=j2n_Texp,
-                        jupper_max=np.max(jupper),
+                        jupper_max=np.max(df["jupper"]),
                     )
-                    self.alpha_ref = np.array(jj2alpha_ref[jlower, jupper])
-                    self.n_Texp = np.array(jj2n_Texp[jlower, jupper])
-            except FileNotFoundError:
-                print(
-                    "Warning: Cannot load .broad. The default broadening parameters are used."
-                )
-                self.alpha_ref = np.array(self.alpha_ref_def * np.ones_like(jlower))
-                self.n_Texp = np.array(self.n_Texp_def * np.ones_like(jlower))
-
+                    self.alpha_ref = np.array(jj2alpha_ref[df["jlower"], df["jupper"]])
+                    self.n_Texp = np.array(jj2n_Texp[df["jlower"], df["jupper"]])
         else:
             print("The default broadening parameters are used.")
-            self.alpha_ref = np.array(self.alpha_ref_def * np.ones_like(jlower))
-            self.n_Texp = np.array(self.n_Texp_def * np.ones_like(jlower))
+            self.alpha_ref = np.array(self.alpha_ref_def * np.ones_like(df["jlower"]))
+            self.n_Texp = np.array(self.n_Texp_def * np.ones_like(df["jlower"]))
+
+        # Add values
+        self.add_column(df, "alpha_ref", self.alpha_ref)
+        self.add_column(df, "n_Texp", self.n_Texp)
 
     def QT_interp(self, T):
         """interpolated partition function
@@ -1435,7 +1439,7 @@ def download(self, molec, extension, numtag=None):
 
         tag = molec.split("__")
         molname_simple = e2s(tag[0])
-
+        # TODO: add progress bar
         for ext in extension:
             if ext == ".trans.bz2" and numtag is not None:
                 ext = "__" + numtag + ext
@@ -1454,12 +1458,10 @@ def download(self, molec, extension, numtag=None):
             for pfname in pfname_arr:
                 pfpath = url + pfname
                 os.makedirs(str(self.path), exist_ok=True)
-                print(
-                    "Downloading "
-                    + pfpath
-                    + " and saving as "
-                    + str(self.path / pfname)
-                )
+                if self.verbose:
+                    print(
+                        "\t\t => Downloading from {}".format(pfpath)
+                    )  # modify indent accordingly print in __init__
                 try:
                     urllib.request.urlretrieve(pfpath, str(self.path / pfname))
                 except HTTPError:
diff --git a/radis/api/hitempapi.py b/radis/api/hitempapi.py
index 91f8dd334..4f865002d 100644
--- a/radis/api/hitempapi.py
+++ b/radis/api/hitempapi.py
@@ -12,7 +12,7 @@
 
 import re
 import urllib.request
-from os.path import basename, join
+from os.path import basename, commonpath, join
 from typing import Union
 
 import numpy as np
@@ -50,9 +50,7 @@
 
 
 def keep_only_relevant(
-    inputfiles,
-    wavenum_min=None,
-    wavenum_max=None,
+    inputfiles, wavenum_min=None, wavenum_max=None, verbose=True
 ) -> Union[list, float, float]:
     """Parser file names for ``wavenum_format`` (min and max) and only keep
     relevant files if the requested range is ``[wavenum_min, wavenum_max]``
@@ -90,7 +88,16 @@ def keep_only_relevant(
             files_wmin = min(float(fname_wmin), files_wmin)
             files_wmax = max(float(fname_wmax), files_wmax)
 
-    print(f"HITEMP keep only relevant input files: {relevantfiles}")
+    if verbose and relevantfiles != []:
+        if len(relevantfiles) > 1:
+            folder = commonpath(relevantfiles)
+            # file_list = [x.replace(folder+'\\', '') for x in relevantfiles]
+            # print(f"In {folder} keep only relevant input files: {file_list}")
+            print(f"In ``{folder}`` keep only relevant input files:")
+            for file in relevantfiles:
+                print(file.replace(folder + "\\", ""))
+        else:
+            print(f"Keep only relevant input file: {relevantfiles}")
 
     return relevantfiles, files_wmin, files_wmax
 
@@ -241,17 +248,16 @@ def fetch_urlnames(self):
         return urlnames
 
     def keep_only_relevant(
-        self,
-        inputfiles,
-        wavenum_min=None,
-        wavenum_max=None,
+        self, inputfiles, wavenum_min=None, wavenum_max=None, verbose=True
     ) -> list:
         """For CO2 and H2O, return only relevant files for given wavenumber range.
 
         If other molecule, return the file anyway.
         see :py:func:`radis.api.hitempapi.keep_only_relevant`"""
         if self.molecule in ["CO2", "H2O"]:
-            inputfiles, _, _ = keep_only_relevant(inputfiles, wavenum_min, wavenum_max)
+            inputfiles, _, _ = keep_only_relevant(
+                inputfiles, wavenum_min, wavenum_max, verbose
+            )
         return inputfiles
 
     def get_linereturn_format(self, opener, urlname, columns):
diff --git a/radis/db/classes.py b/radis/db/classes.py
index a2e76b4a9..debfeebc5 100644
--- a/radis/db/classes.py
+++ b/radis/db/classes.py
@@ -312,10 +312,12 @@ def get_molecule(molecule_id):
     "C2H2",
     "C2H4",
     "CH",
+    "CH_p",
     "CH3",
     "CH3Cl",
     "CH3F",
     "CH4",
+    "CH_p",
     "CN",
     "CO",
     "CO2",
diff --git a/radis/io/exomol.py b/radis/io/exomol.py
index a78cd0ff7..1d21d359b 100644
--- a/radis/io/exomol.py
+++ b/radis/io/exomol.py
@@ -166,20 +166,21 @@ def fetch_exomol(
     known_exomol_databases, recommended_database = get_exomol_database_list(
         molecule, full_molecule_name
     )
-
-    _exomol_use_hint = "Select one of them with `radis.fetch_exomol(DATABASE_NAME)`, `SpectrumFactory.fetch_databank('exomol', exomol_database=DATABASE_NAME')`, or `calc_spectrum(..., databank=('exomol', DATABASE_NAME))` \n"
+    if verbose:
+        print("\n========== Loading Exomol database [start] ==========")
+    _exomol_use_hint = "Select one of them with `fetch_exomol(DATABASE_NAME)`, `SpectrumFactory.fetch_databank('exomol', exomol_database=DATABASE_NAME')`, or `calc_spectrum(..., databank=('exomol', DATABASE_NAME))` \n"
     if database is None or database == "default":
         if len(known_exomol_databases) == 1:
-            database = known_exomol_databases[0]
-            if verbose:
-                print(f"Using ExoMol database {database} for {full_molecule_name}")
+            database = known_exomol_databases[
+                0
+            ]  # TODO: if there is only one, is it not the recommended one?
         elif recommended_database:
             database = recommended_database
-            if verbose:
+            if verbose > 1:
                 print(
-                    f"Using ExoMol database {database} for {full_molecule_name} (recommended by the ExoMol team). All available databases are {known_exomol_databases}. {_exomol_use_hint}"
+                    f"For {full_molecule_name}, the available databases are {known_exomol_databases}. {_exomol_use_hint}"
                 )
-        else:
+        else:  # TODO: Explain here when this case occurs...
             raise KeyError(
                 f"Choose one of the several databases available for {full_molecule_name} in ExoMol: {known_exomol_databases}. ({recommended_database} is recommended by the ExoMol team). {_exomol_use_hint}"
             )
@@ -207,6 +208,7 @@ def fetch_exomol(
     mdb = MdbExomol(
         local_path,
         molecule=molecule,
+        database=database,
         name=databank_name,
         local_databases=local_databases,
         nurange=[
@@ -216,6 +218,7 @@ def fetch_exomol(
         engine=engine,
         cache=cache,
         skip_optional_data=skip_optional_data,
+        verbose=verbose,
     )
 
     # Get local files
@@ -261,7 +264,7 @@ def fetch_exomol(
         )
 
     # Add broadening
-    mdb.set_broadening(df, output=output)
+    mdb.set_broadening_coef(df, output=output)
 
     # Specific for RADIS :
     # ... Get RADIS column names:
@@ -316,4 +319,6 @@ def fetch_exomol(
         assert return_local_path
         out.append(mdb.to_partition_function_tabulator())
 
+    if verbose:
+        print("========== Loading Exomol database [end] ==========\n")
     return out
diff --git a/radis/io/geisa.py b/radis/io/geisa.py
index c6fe2f70e..26ada5939 100644
--- a/radis/io/geisa.py
+++ b/radis/io/geisa.py
@@ -171,12 +171,14 @@ def fetch_geisa(
     if isotope and type(isotope) == int:
         isotope = str(isotope)
 
+    # Load and return
     df = ldb.load(
         local_files,  # filter other files,
         columns=columns,
-        isotope=isotope,
-        load_wavenum_min=load_wavenum_min,  # for relevant files, get only the right range
-        load_wavenum_max=load_wavenum_max,
+        within=[("iso", isotope)] if isotope is not None else [],
+        # for relevant files, get only the right range :
+        lower_bound=[("wav", load_wavenum_min)] if load_wavenum_min is not None else [],
+        upper_bound=[("wav", load_wavenum_max)] if load_wavenum_max is not None else [],
         output=output,
     )
 
diff --git a/radis/io/hitemp.py b/radis/io/hitemp.py
index 7a38006e0..87cd62649 100644
--- a/radis/io/hitemp.py
+++ b/radis/io/hitemp.py
@@ -141,7 +141,7 @@ def fetch_hitemp(
 
     # Delete files if needed:
     relevant_files = ldb.keep_only_relevant(
-        local_files, load_wavenum_min, load_wavenum_max
+        local_files, load_wavenum_min, load_wavenum_max, verbose=(verbose > 1)
     )
     if cache == "regen":
         ldb.remove_local_files(relevant_files)
@@ -153,7 +153,7 @@ def fetch_hitemp(
     # Get missing files
     download_files = ldb.get_missing_files(local_files)
     download_files = ldb.keep_only_relevant(
-        download_files, load_wavenum_min, load_wavenum_max
+        download_files, load_wavenum_min, load_wavenum_max, verbose=(verbose > 1)
     )
     # do not re-download files if they exist in another format :
     if engine in ["vaex", "auto", "default"]:
@@ -204,7 +204,7 @@ def fetch_hitemp(
 
     # Load and return
     files_loaded = ldb.keep_only_relevant(
-        local_files, load_wavenum_min, load_wavenum_max
+        local_files, load_wavenum_min, load_wavenum_max, verbose=verbose
     )
 
     if isotope and type(isotope) == int:
diff --git a/radis/lbl/calc.py b/radis/lbl/calc.py
index f657b157b..24c5bda2c 100644
--- a/radis/lbl/calc.py
+++ b/radis/lbl/calc.py
@@ -20,7 +20,7 @@
 from copy import deepcopy
 from os.path import exists
 
-# from radis.db.classes import M
+import numpy as np
 
 try:  # Proper import
     from .base import get_wavenumber_range
@@ -660,7 +660,7 @@ def _calc_spectrum_one_molecule(
 
     def _is_at_equilibrium():
         try:
-            assert Tvib is None or Tvib == Tgas
+            assert Tvib is None or (np.array(Tvib) == np.array(Tgas)).all()
             assert Trot is None or Trot == Tgas
             assert overpopulation is None
             if "self_absorption" in kwargs:
@@ -712,6 +712,10 @@ def _is_at_equilibrium():
         diluent_other_than_air = len(diluent) > 1 or (
             len(diluent) == 1 and "air" not in diluent
         )
+    if diluent_other_than_air and databank == "exomol":
+        raise NotImplementedError(
+            "Only air broadening is implemented in RADIS with ExoMol. Please reach out on https://github.com/radis/radis/issues"
+        )
 
     # Load databank
     # -------------
diff --git a/radis/lbl/loader.py b/radis/lbl/loader.py
index 6a814dc52..894392bdb 100644
--- a/radis/lbl/loader.py
+++ b/radis/lbl/loader.py
@@ -1289,6 +1289,10 @@ def fetch_databank(
                 )
             isotope_list = self._get_isotope_list()
 
+            # Check the specific ExoMol database and print ONCE the list of databases available
+            if self.verbose and (database is None or database == "default"):
+                print("Using the recommended ExoMol databases for {}".format(molecule))
+
             local_paths = []
             frames = []  # lines for all isotopes
             partition_function_exomol = {
@@ -2307,7 +2311,7 @@ def load_and_concat(files):
                         raise
                     else:
                         # Irrelevant file, just print and continue.
-                        if verbose >= 2:
+                        if self.verbose >= 2:
                             printg(str(err))
                         continue
 
@@ -2319,7 +2323,7 @@ def load_and_concat(files):
                     ):
                         del df[col]
                         dropped.append(col)
-                if verbose >= 2 and len(dropped) > 0:
+                if self.verbose >= 2 and len(dropped) > 0:
                     print("Dropped columns: {0}".format(dropped))
 
                 # Crop to the wavenumber of interest
diff --git a/radis/spectrum/spectrum.py b/radis/spectrum/spectrum.py
index a72f06808..146559985 100644
--- a/radis/spectrum/spectrum.py
+++ b/radis/spectrum/spectrum.py
@@ -1861,8 +1861,14 @@ def get_power(self, unit="mW/cm2/sr"):
         :ref:`the Spectrum page <label_spectrum>`
         """
 
-        P = self.get_integral("radiance_noslit", wunit="nm", Iunit="mW/cm2/sr/nm")
-        # P is in mW/cm2/sr/nm * nm
+        # New calculation as suggested in bug #460:
+        P = self.get_integral("radiance_noslit", wunit="cm-1", Iunit="mW/cm2/sr/cm-1")
+
+        # Old calculation before bug #460.
+        # Mixes wavelengths in vacuum and air, which creates an error of 1.00027.
+        # P = self.get_integral("radiance_noslit", wunit="nm", Iunit="mW/cm2/sr/nm")
+
+        # P is in mW/cm2/sr/cm-1 * cm-1
         return conv2(P, "mW/cm2/sr", unit)
 
     def has_nan(self, ignore_wavespace=True) -> bool:


Test patch:
diff --git a/radis/test/lbl/test_spectrum.py b/radis/test/lbl/test_spec.py
similarity index 100%
rename from radis/test/lbl/test_spectrum.py
rename to radis/test/lbl/test_spec.py
diff --git a/radis/test/spectrum/test_spectrum.py b/radis/test/spectrum/test_spectrum.py
index 631b69ea4..ef5f6d5da 100644
--- a/radis/test/spectrum/test_spectrum.py
+++ b/radis/test/spectrum/test_spectrum.py
@@ -32,6 +32,7 @@
 # %% Test routines
 
 
+@pytest.mark.fast
 def test_spectrum_creation_method(*args, **kwargs):
     import pytest
 
@@ -87,6 +88,7 @@ def test_spectrum_creation_method(*args, **kwargs):
         Spectrum({"wavelength": w, "abscoeff": k}, wunit="cm-1")
 
 
+@pytest.mark.fast
 def test_spectrum_get_methods(
     verbose=True, plot=True, close_plots=True, *args, **kwargs
 ):
@@ -115,11 +117,11 @@ def test_spectrum_get_methods(
         == s.get("radiance_noslit", Iunit="W/m2/sr/nm")[1]
     )
     assert all(nm2cm(s.get_wavelength(medium="vacuum")) == s.get_wavenumber())
-    assert np.isclose(s.get_power(unit="W/cm2/sr"), 2631.6288408588148)
+    assert np.isclose(s.get_power(unit="W/cm2/sr"), 2632.311479516498)
     assert s.get_waveunit() == "nm"
     assert np.isclose(
         s.get_power(unit="W/cm2/sr"),
-        s.get_integral("radiance_noslit", Iunit="W/cm2/sr/nm"),
+        s.get_integral("radiance_noslit", wunit="nm_vac", Iunit="W/cm2/sr/nm"),
     )
     assert s.get_conditions()["Tgas"] == 1500
     assert len(s.get_vars()) == 2
@@ -621,23 +623,23 @@ def _run_testcases(
 
 
 if __name__ == "__main__":
-    # print(("Test spectrum: ", _run_testcases(debug=False, close_plots=False)))
+    print(("Test spectrum: ", _run_testcases(debug=False, close_plots=False)))
 
-    import radis
+    # import radis
 
-    s = radis.test_spectrum()
-    assert s.c["default_output_unit"] == "cm-1"
+    # s = radis.test_spectrum()
+    # assert s.c["default_output_unit"] == "cm-1"
 
-    assert (s.get("abscoeff")[0] == s.get_wavenumber()).all()
+    # assert (s.get("abscoeff")[0] == s.get_wavenumber()).all()
 
-    s.c["default_output_unit"] = "nm"
+    # s.c["default_output_unit"] = "nm"
 
-    assert (s.get("abscoeff")[0] == s.get_wavelength()).all()
-    s.c["default_output_unit"] = "nm_vac"
-    assert (s.get("abscoeff")[0] == s.get_wavelength(medium="vacuum")).all()
+    # assert (s.get("abscoeff")[0] == s.get_wavelength()).all()
+    # s.c["default_output_unit"] = "nm_vac"
+    # assert (s.get("abscoeff")[0] == s.get_wavelength(medium="vacuum")).all()
 
-    #%%
-    from radis import load_spec
-    from radis.test.utils import getTestFile
+    # #%%
+    # from radis import load_spec
+    # from radis.test.utils import getTestFile
 
-    s_exp = load_spec(getTestFile("CO2_measured_spectrum_4-5um.spec"), binary=True)
+    # s_exp = load_spec(getTestFile("CO2_measured_spectrum_4-5um.spec"), binary=True)