Skip to content

Commit

Permalink
Adding an EquipmentException and raising it instead of exit()
Browse files Browse the repository at this point in the history
This corresponds to jktjk comment
230#discussion_r287085866

+ improving a bit the code for linter

Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
  • Loading branch information
EstherLerouzic committed May 24, 2019
1 parent 40636ec commit 3a795ec
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 39 deletions.
79 changes: 41 additions & 38 deletions gnpy/core/equipment.py
Expand Up @@ -14,10 +14,13 @@
from math import isclose
from pathlib import Path
from json import load
from gnpy.core.utils import lin2db, db2lin, load_json
from gnpy.core.utils import lin2db, db2lin, load_json, EquipmentError
from collections import namedtuple
from gnpy.core.elements import Edfa
import time
from logging import getLogger

LOGGER = getLogger(__name__)

Model_vg = namedtuple('Model_vg', 'nf1 nf2 delta_p')
Model_fg = namedtuple('Model_fg', 'nf0')
Expand All @@ -27,28 +30,28 @@

class common:
def update_attr(self, default_values, kwargs, name):
clean_kwargs = {k:v for k,v in kwargs.items() if v !=''}
for k,v in default_values.items():
setattr(self, k, clean_kwargs.get(k,v))
if k not in clean_kwargs and name != 'Amp' :
clean_kwargs = {k:v for k, v in kwargs.items() if v != ''}
for k, v in default_values.items():
setattr(self, k, clean_kwargs.get(k, v))
if k not in clean_kwargs and name != 'Amp':
print(f'\x1b[1;31;40m'+
f'\n WARNING missing {k} attribute in eqpt_config.json[{name}]'
f'\n default value is {k} = {v}'
+ '\x1b[0m')
f'\n WARNING missing {k} attribute in eqpt_config.json[{name}]'+
f'\n default value is {k} = {v}'+
f'\x1b[0m')
time.sleep(1)

class SI(common):
default_values =\
{
"f_min": 191.35e12,
"f_max": 196.1e12,
"baud_rate": 32e9,
"baud_rate": 32e9,
"spacing": 50e9,
"power_dbm": 0,
"power_range_db": [0,0,0.5],
"power_range_db": [0, 0, 0.5],
"roll_off": 0.15,
"tx_osnr": 45,
"sys_margins": 0
"sys_margins": 0
}

def __init__(self, **kwargs):
Expand All @@ -69,7 +72,7 @@ class Span(common):
'con_in': 0,
'con_out': 0
}

def __init__(self, **kwargs):
self.update_attr(self.default_values, kwargs, 'Span')

Expand All @@ -82,7 +85,7 @@ class Roadm(common):
'preamp_variety_list':[],
'booster_variety_list':[]
}
}
}

def __init__(self, **kwargs):
self.update_attr(self.default_values, kwargs, 'Roadm')
Expand Down Expand Up @@ -138,7 +141,8 @@ def from_json(cls, filename, **kwargs):
config = Path(filename).parent / 'default_edfa_config.json'

type_variety = kwargs['type_variety']
type_def = kwargs.get('type_def', 'variable_gain') #default compatibility with older json eqpt files
type_def = kwargs.get('type_def', 'variable_gain')
#default compatibility with older json eqpt files
nf_def = None
dual_stage_def = None

Expand Down Expand Up @@ -187,7 +191,7 @@ def from_json(cls, filename, **kwargs):
with open(config, encoding='utf-8') as f:
json_data = load(f)

return cls(**{**kwargs, **json_data,
return cls(**{**kwargs, **json_data,
'nf_model': nf_def, 'dual_stage_model': dual_stage_def})


Expand Down Expand Up @@ -260,7 +264,7 @@ def trx_mode_params(equipment, trx_type_variety='', trx_mode='', error_message=F
"""return the trx and SI parameters from eqpt_config for a given type_variety and mode (ie format)"""
trx_params = {}
default_si_data = equipment['SI']['default']

try:
trxs = equipment['Transceiver']
#if called from path_requests_run.py, trx_mode is filled with None when not specified by user
Expand All @@ -279,14 +283,14 @@ def trx_mode_params(equipment, trx_type_variety='', trx_mode='', error_message=F
exit()
else:
mode_params = {"format": "undetermined",
"baud_rate": None,
"OSNR": None,
"bit_rate": None,
"roll_off": None,
"tx_osnr":None,
"min_spacing":None,
"cost":None}
trx_params = {**mode_params}
"baud_rate": None,
"OSNR": None,
"bit_rate": None,
"roll_off": None,
"tx_osnr":None,
"min_spacing":None,
"cost":None}
trx_params = {**mode_params}
trx_params['f_min'] = equipment['Transceiver'][trx_type_variety].frequency['min']
trx_params['f_max'] = equipment['Transceiver'][trx_type_variety].frequency['max']

Expand Down Expand Up @@ -315,16 +319,16 @@ def trx_mode_params(equipment, trx_type_variety='', trx_mode='', error_message=F
nch = automatic_nch(trx_params['f_min'], trx_params['f_max'], trx_params['spacing'])
trx_params['nb_channel'] = nch
print(f'There are {nch} channels propagating')

trx_params['power'] = db2lin(default_si_data.power_dbm)*1e-3

return trx_params

def automatic_spacing(baud_rate):
"""return the min possible channel spacing for a given baud rate"""
# TODO : this should parametrized in a cfg file
spacing_list = [(33e9,37.5e9), (38e9,50e9), (50e9,62.5e9), (67e9,75e9), (92e9,100e9)] #list of possible tuples
#[(max_baud_rate, spacing_for_this_baud_rate)]
spacing_list = [(33e9, 37.5e9), (38e9, 50e9), (50e9, 62.5e9), (67e9, 75e9), (92e9, 100e9)]
#list of possible tuples [(max_baud_rate, spacing_for_this_baud_rate)]
return min((s[1] for s in spacing_list if s[0] > baud_rate), default=baud_rate*1.2)

def automatic_nch(f_min, f_max, spacing):
Expand All @@ -350,12 +354,12 @@ def update_dual_stage(equipment):
if edfa.type_def == 'dual_stage':
edfa_preamp = edfa_dict[edfa.dual_stage_model.preamp_variety]
edfa_booster = edfa_dict[edfa.dual_stage_model.booster_variety]
for k,v in edfa_preamp.__dict__.items():
for k, v in edfa_preamp.__dict__.items():
attr_k = 'preamp_'+k
setattr(edfa, attr_k, v)
for k,v in edfa_booster.__dict__.items():
for k, v in edfa_booster.__dict__.items():
attr_k = 'booster_'+k
setattr(edfa, attr_k, v)
setattr(edfa, attr_k, v)
edfa.p_max = edfa_booster.p_max
edfa.gain_flatmax = edfa_booster.gain_flatmax + edfa_preamp.gain_flatmax
if edfa.gain_min < edfa_preamp.gain_min:
Expand All @@ -364,7 +368,7 @@ def update_dual_stage(equipment):
+ f'CRITICAL: dual stage {edfa.type_variety} min gain is lower than its preamp min gain\
=> please increase its min gain in eqpt_config.json'\
+ '\x1b[0m'
)
)
exit()
return equipment

Expand All @@ -378,12 +382,11 @@ def roadm_restrictions_sanity_check(equipment):
if equipment['Edfa'][amp_name]:
pass
except KeyError:
print(
f'\x1b[1;31;40m'\
+ f'CRITICAL: restriction {amp_name} is not a valid Edfa name, not listed in eqpt_config.json'\
msg = f'\x1b[1;31;40m'\
+ f'CRITICAL: ROADM restriction {amp_name} does not refer to a defined EDFA name'\
+ '\x1b[0m'
)
exit()
LOGGER.critical(msg)
raise EquipmentError(msg)

def equipment_from_json(json_data, filename):
"""build global dictionnary eqpt_library that stores all eqpt characteristics:
Expand All @@ -399,10 +402,10 @@ def equipment_from_json(json_data, filename):
equipment[key] = {}
typ = globals()[key]
for entry in entries:
subkey = entry.get('type_variety', 'default')
subkey = entry.get('type_variety', 'default')
if key == 'Edfa':
equipment[key][subkey] = Amp.from_json(filename, **entry)
else:
else:
equipment[key][subkey] = typ(**entry)
equipment = update_trx_osnr(equipment)
equipment = update_dual_stage(equipment)
Expand Down
8 changes: 7 additions & 1 deletion gnpy/core/utils.py
Expand Up @@ -11,8 +11,8 @@

import json

import numpy as np
from csv import writer
import numpy as np
from numpy import pi, cos, sqrt, log10
from scipy import constants

Expand Down Expand Up @@ -238,3 +238,9 @@ def silent_remove(this_list, elem):
this_list.remove(elem)
except ValueError:
pass

class EquipmentError(Exception):
"""Raised when the json equipment is not formed correctly
"""
import sys
sys.tracebacklimit = 0

0 comments on commit 3a795ec

Please sign in to comment.