From 3eb357241b037cecaa40253637612054721fc090 Mon Sep 17 00:00:00 2001 From: yokochi47 Date: Wed, 4 Dec 2024 19:59:31 +0900 Subject: [PATCH] Add XEASY peak reader and parserlistener with predition for spectral region --- wwpdb/utils/nmr/pk/BasePKParserListener.py | 19 +- wwpdb/utils/nmr/pk/NmrPipePKParserListener.py | 113 +- wwpdb/utils/nmr/pk/NmrViewPKParser.py | 870 ++++++------- wwpdb/utils/nmr/pk/NmrViewPKParserListener.py | 203 +-- wwpdb/utils/nmr/pk/XeasyPKLexer.py | 458 ++++--- wwpdb/utils/nmr/pk/XeasyPKParser.py | 469 ++++--- wwpdb/utils/nmr/pk/XeasyPKParserListener.py | 1138 ++++++++++++++++- wwpdb/utils/nmr/pk/XeasyPKReader.py | 216 ++++ .../antlr-grammars-v4.10/NmrViewPKParser.g4 | 2 +- .../antlr-grammars-v4.10/XeasyPKLexer.g4 | 5 +- .../antlr-grammars-v4.10/XeasyPKParser.g4 | 12 +- 11 files changed, 2467 insertions(+), 1038 deletions(-) create mode 100644 wwpdb/utils/nmr/pk/XeasyPKReader.py diff --git a/wwpdb/utils/nmr/pk/BasePKParserListener.py b/wwpdb/utils/nmr/pk/BasePKParserListener.py index 8057055b..45b9ba49 100644 --- a/wwpdb/utils/nmr/pk/BasePKParserListener.py +++ b/wwpdb/utils/nmr/pk/BasePKParserListener.py @@ -209,6 +209,7 @@ class BasePKParserListener(): # spectral metadata num_of_dim = -1 + acq_dim_id = 1 spectral_dim = {} # whether to allow extended sequence temporary @@ -224,6 +225,9 @@ class BasePKParserListener(): numberSelection = [] originalNumberSelection = [] + # collection of assignment (XEASY) + assignmentSelection = [] + f = None warningMessage = None @@ -375,7 +379,8 @@ def validatePeak2D(self, index: int, pos_1: float, pos_2: float, lw_1: Optional[float], lw_2: Optional[float], pos_hz_1: Optional[float], pos_hz_2: Optional[float], lw_hz_1: Optional[float], lw_hz_2: Optional[float], - height: Optional[str], height_uncertainty: Optional[str], volume: Optional[str]) -> Optional[dict]: + height: Optional[str], height_uncertainty: Optional[str], + volume: Optional[str], volume_uncertainty: Optional[str]) -> Optional[dict]: dstFunc = {'position_1': str(pos_1), 'position_2': str(pos_2)} @@ -385,6 +390,8 @@ def validatePeak2D(self, index: int, pos_1: float, pos_2: float, dstFunc['volume'] = volume if height_uncertainty is not None and float(height_uncertainty) != 0.0: dstFunc['height_uncertainty'] = height_uncertainty + if volume_uncertainty is not None and float(volume_uncertainty) != 0.0: + dstFunc['volume_uncertainty'] = volume_uncertainty if 'height' not in dstFunc and 'volume' not in dstFunc: self.f.append(f"[Missing data] {self.__getCurrentRestraint(n=index)}" @@ -427,7 +434,8 @@ def validatePeak3D(self, index: int, pos_1: float, pos_2: float, pos_3: float, lw_1: Optional[float], lw_2: Optional[float], lw_3: Optional[float], pos_hz_1: Optional[float], pos_hz_2: Optional[float], pos_hz_3: Optional[float], lw_hz_1: Optional[float], lw_hz_2: Optional[float], lw_hz_3: Optional[float], - height: Optional[str], height_uncertainty: Optional[str], volume: Optional[str]) -> Optional[dict]: + height: Optional[str], height_uncertainty: Optional[str], + volume: Optional[str], volume_uncertainty: Optional[str]) -> Optional[dict]: dstFunc = {'position_1': str(pos_1), 'position_2': str(pos_2), 'position_3': str(pos_3)} @@ -437,6 +445,8 @@ def validatePeak3D(self, index: int, pos_1: float, pos_2: float, pos_3: float, dstFunc['volume'] = volume if height_uncertainty is not None and float(height_uncertainty) != 0.0: dstFunc['height_uncertainty'] = height_uncertainty + if volume_uncertainty is not None and float(volume_uncertainty) != 0.0: + dstFunc['volume_uncertainty'] = volume_uncertainty if 'height' not in dstFunc and 'volume' not in dstFunc: self.f.append(f"[Missing data] {self.__getCurrentRestraint(n=index)}" @@ -495,7 +505,8 @@ def validatePeak4D(self, index: int, pos_1: float, pos_2: float, pos_3: float, p lw_1: Optional[float], lw_2: Optional[float], lw_3: Optional[float], lw_4: Optional[float], pos_hz_1: Optional[float], pos_hz_2: Optional[float], pos_hz_3: Optional[float], pos_hz_4: Optional[float], lw_hz_1: Optional[float], lw_hz_2: Optional[float], lw_hz_3: Optional[float], lw_hz_4: Optional[float], - height: Optional[str], height_uncertainty: Optional[str], volume: Optional[str]) -> Optional[dict]: + height: Optional[str], height_uncertainty: Optional[str], + volume: Optional[str], volume_uncertainty: Optional[str]) -> Optional[dict]: dstFunc = {'position_1': str(pos_1), 'position_2': str(pos_2), 'position_3': str(pos_3), 'position_4': str(pos_4)} @@ -505,6 +516,8 @@ def validatePeak4D(self, index: int, pos_1: float, pos_2: float, pos_3: float, p dstFunc['volume'] = volume if height_uncertainty is not None and float(height_uncertainty) != 0.0: dstFunc['height_uncertainty'] = height_uncertainty + if volume_uncertainty is not None and float(volume_uncertainty) != 0.0: + dstFunc['volume_uncertainty'] = volume_uncertainty if 'height' not in dstFunc and 'volume' not in dstFunc: self.f.append(f"[Missing data] {self.__getCurrentRestraint(n=index)}" diff --git a/wwpdb/utils/nmr/pk/NmrPipePKParserListener.py b/wwpdb/utils/nmr/pk/NmrPipePKParserListener.py index a7995e2e..5049ad48 100644 --- a/wwpdb/utils/nmr/pk/NmrPipePKParserListener.py +++ b/wwpdb/utils/nmr/pk/NmrPipePKParserListener.py @@ -10,6 +10,7 @@ import re import copy import collections +import numpy as np import math from antlr4 import ParseTreeListener @@ -79,6 +80,7 @@ def __init__(self, verbose=True, log=sys.stdout, # Enter a parse tree produced by NmrPipePKParser#nmrpipe_pk. def enterNmrpipe_pk(self, ctx: NmrPipePKParser.Nmrpipe_pkContext): # pylint: disable=unused-argument self.num_of_dim = -1 + self.acq_dim_id = 1 self.spectral_dim = {} self.listIdInternal = {} self.chainNumberDict = {} @@ -385,14 +387,47 @@ def exitNmrpipe_pk(self, ctx: NmrPipePKParser.Nmrpipe_pkContext): # pylint: dis del self.reasonsForReParsing['local_seq_scheme'] if len(self.spectral_dim) > 0: - for v in self.spectral_dim.values(): - for _v in v.values(): + for d, v in self.spectral_dim.items(): + for _id, _v in v.items(): for __v in _v.values(): - if __v['spectrometer_frequency'] is None and 'freq_hint' in __v and len(__v['freq_hint']) > 0: - __v['spectrometer_frequency'] = collections.Counter(__v['freq_hint']).most_common()[0][0] if 'freq_hint' in __v: + center = np.mean(np.array(__v['freq_hint'])) + + if __v['spectral_region'] is None: + atom_type = __v['atom_type'] + if 125 < center < 130 and atom_type == 'C': + __v['spectral_region'] = 'C_aro' + elif 115 < center < 125 and atom_type == 'N': + __v['spectral_region'] = 'N_ami' + elif 170 < center < 180 and atom_type == 'C': + __v['spectral_region'] = 'CO' + elif 6 < center < 9 and atom_type == 'H': + __v['spectral_region'] = 'H_ami_or_aro' + elif 4 < center < 6 and atom_type == 'H': + __v['spectral_region'] = 'H_all' + elif 60 < center < 90 and atom_type == 'C': + __v['spectral_region'] = 'C_all' + elif 30 < center < 50 and atom_type == 'C': + __v['spectral_region'] = 'C_ali' + del __v['freq_hint'] + if __v['spectrometer_frequency'] is None and 'obs_freq_hint' in __v and len(__v['obs_freq_hint']) > 0: + __v['spectrometer_frequency'] = collections.Counter(__v['obs_freq_hint']).most_common()[0][0] + + if 'obs_freq_hint' in __v: + del __v['obs_freq_hint'] + + for __v in _v.values(): + if __v['spectral_region'] == 'H_ami_or_aro': + has_a = any(___v['spectral_region'] == 'C_aro' for ___v in _v.values()) + __v['spectral_region'] = 'H_aro' if has_a else 'H_ami' + + if self.debug: + print(f'num_of_dim: {d}, list_id: {_id}') + for __d, __v in _v.items(): + print(f'{__d} {__v}') + finally: self.warningMessage = sorted(list(set(self.f)), key=self.f.index) @@ -436,9 +471,12 @@ def set_spectral_dim(_dim_id): isotope_number = cur_spectral_dim['atom_isotope_number'] - cur_spectral_dim['acquisition'] = 'yes' if _dim_id == 1 and (isotope_number == 1 - or (isotope_number == 13 - and self.exptlMethod == 'SOLID-STATE NMR')) else 'no' + cur_spectral_dim['acquisition'] = 'yes' if _dim_id == self.acq_dim_id\ + and (isotope_number == 1 or (isotope_number == 13 and self.exptlMethod == 'SOLID-STATE NMR')) else 'no' + + if _dim_id == 1 and cur_spectral_dim['acquisition'] == 'no': + self.acq_dim_id = self.num_of_dim + cur_spectral_dim['under_sampling_type'] = 'not observed' if cur_spectral_dim['acquisition'] == 'yes' else 'aliased' if ctx.Ppm_value_DA(0) and ctx.Ppm_value_DA(1): @@ -506,6 +544,7 @@ def enterPeak_list_2d(self, ctx: NmrPipePKParser.Peak_list_2dContext): # pylint or _dim_id not in self.cur_spectral_dim else self.cur_spectral_dim[_dim_id]) self.spectral_dim[self.num_of_dim][self.cur_list_id][_dim_id]['freq_hint'] = [] + self.spectral_dim[self.num_of_dim][self.cur_list_id][_dim_id]['obs_freq_hint'] = [] self.peaks2D = 0 self.cur_spectral_dim = {} @@ -570,7 +609,7 @@ def exitPeak_2d(self, ctx: NmrPipePKParser.Peak_2dContext): return dstFunc = self.validatePeak2D(index, x_ppm, y_ppm, None, None, None, None, - x_hz, y_hz, xw_hz, yw_hz, height, dheight, vol) + x_hz, y_hz, xw_hz, yw_hz, height, dheight, vol, None) if dstFunc is None: self.peaks2D -= 1 @@ -578,14 +617,17 @@ def exitPeak_2d(self, ctx: NmrPipePKParser.Peak_2dContext): cur_spectral_dim = self.spectral_dim[self.num_of_dim][self.cur_list_id] + cur_spectral_dim[1]['freq_hint'].append(x_ppm) + cur_spectral_dim[2]['freq_hint'].append(y_ppm) + if x_ppm is not None and x_hz is not None and cur_spectral_dim[1]['spectrometer_frequency'] is None\ and isinstance(cur_spectral_dim[1]['value_first_point'], float): - cur_spectral_dim[1]['freq_hint'].append(float(roundString(str(x_hz / (x_ppm - cur_spectral_dim[1]['value_first_point'])), - getMaxEffDigits([str(x_ppm), str(x_hz)])))) + cur_spectral_dim[1]['obs_freq_hint'].append(float(roundString(str(x_hz / (cur_spectral_dim[1]['value_first_point'] - x_ppm)), + getMaxEffDigits([str(x_ppm), str(x_hz)])))) if y_ppm is not None and y_hz is not None and cur_spectral_dim[2]['spectrometer_frequency'] is None\ and isinstance(cur_spectral_dim[2]['value_first_point'], float): - cur_spectral_dim[2]['freq_hint'].append(float(roundString(str(y_hz / (y_ppm - cur_spectral_dim[2]['value_first_point'])), - getMaxEffDigits([str(y_ppm), str(y_hz)])))) + cur_spectral_dim[2]['obs_freq_hint'].append(float(roundString(str(y_hz / (cur_spectral_dim[2]['value_first_point'] - y_ppm)), + getMaxEffDigits([str(y_ppm), str(y_hz)])))) has_assignments = False @@ -684,6 +726,7 @@ def enterPeak_list_3d(self, ctx: NmrPipePKParser.Peak_list_3dContext): # pylint or _dim_id not in self.cur_spectral_dim else self.cur_spectral_dim[_dim_id]) self.spectral_dim[self.num_of_dim][self.cur_list_id][_dim_id]['freq_hint'] = [] + self.spectral_dim[self.num_of_dim][self.cur_list_id][_dim_id]['obs_freq_hint'] = [] self.peaks3D = 0 self.cur_spectral_dim = {} @@ -751,12 +794,12 @@ def exitPeak_3d(self, ctx: NmrPipePKParser.Peak_3dContext): if not self.hasPolySeq and not self.hasNonPolySeq: return - if x_ppm is None or y_ppm is None or type != 1: + if x_ppm is None or y_ppm is None or z_ppm is None or type != 1: self.peaks3D -= 1 return dstFunc = self.validatePeak3D(index, x_ppm, y_ppm, z_ppm, None, None, None, None, None, None, - x_hz, y_hz, z_hz, xw_hz, yw_hz, zw_hz, height, dheight, vol) + x_hz, y_hz, z_hz, xw_hz, yw_hz, zw_hz, height, dheight, vol, None) if dstFunc is None: self.peaks3D -= 1 @@ -764,18 +807,22 @@ def exitPeak_3d(self, ctx: NmrPipePKParser.Peak_3dContext): cur_spectral_dim = self.spectral_dim[self.num_of_dim][self.cur_list_id] + cur_spectral_dim[1]['freq_hint'].append(x_ppm) + cur_spectral_dim[2]['freq_hint'].append(y_ppm) + cur_spectral_dim[3]['freq_hint'].append(z_ppm) + if x_ppm is not None and x_hz is not None and cur_spectral_dim[1]['spectrometer_frequency'] is None\ and isinstance(cur_spectral_dim[1]['value_first_point'], float): - cur_spectral_dim[1]['freq_hint'].append(float(roundString(str(x_hz / (x_ppm - cur_spectral_dim[1]['value_first_point'])), - getMaxEffDigits([str(x_ppm), str(x_hz)])))) + cur_spectral_dim[1]['obs_freq_hint'].append(float(roundString(str(x_hz / (cur_spectral_dim[1]['value_first_point'] - x_ppm)), + getMaxEffDigits([str(x_ppm), str(x_hz)])))) if y_ppm is not None and y_hz is not None and cur_spectral_dim[2]['spectrometer_frequency'] is None\ and isinstance(cur_spectral_dim[2]['value_first_point'], float): - cur_spectral_dim[2]['freq_hint'].append(float(roundString(str(y_hz / (y_ppm - cur_spectral_dim[2]['value_first_point'])), - getMaxEffDigits([str(y_ppm), str(y_hz)])))) + cur_spectral_dim[2]['obs_freq_hint'].append(float(roundString(str(y_hz / (cur_spectral_dim[2]['value_first_point'] - y_ppm)), + getMaxEffDigits([str(y_ppm), str(y_hz)])))) if z_ppm is not None and z_hz is not None and cur_spectral_dim[3]['spectrometer_frequency'] is None\ and isinstance(cur_spectral_dim[3]['value_first_point'], float): - cur_spectral_dim[3]['freq_hint'].append(float(roundString(str(z_hz / (z_ppm - cur_spectral_dim[3]['value_first_point'])), - getMaxEffDigits([str(z_ppm), str(z_hz)])))) + cur_spectral_dim[3]['obs_freq_hint'].append(float(roundString(str(z_hz / (cur_spectral_dim[3]['value_first_point'] - z_ppm)), + getMaxEffDigits([str(z_ppm), str(z_hz)])))) has_assignments = False @@ -886,6 +933,7 @@ def enterPeak_list_4d(self, ctx: NmrPipePKParser.Peak_list_4dContext): # pylint or _dim_id not in self.cur_spectral_dim else self.cur_spectral_dim[_dim_id]) self.spectral_dim[self.num_of_dim][self.cur_list_id][_dim_id]['freq_hint'] = [] + self.spectral_dim[self.num_of_dim][self.cur_list_id][_dim_id]['obs_freq_hint'] = [] self.peaks4D = 0 self.cur_spectral_dim = {} @@ -961,12 +1009,12 @@ def exitPeak_4d(self, ctx: NmrPipePKParser.Peak_4dContext): if not self.hasPolySeq and not self.hasNonPolySeq: return - if x_ppm is None or y_ppm is None or type != 1: + if x_ppm is None or y_ppm is None or z_ppm is None or a_ppm is None or type != 1: self.peaks4D -= 1 return dstFunc = self.validatePeak4D(index, x_ppm, y_ppm, z_ppm, a_ppm, None, None, None, None, None, None, None, None, - x_hz, y_hz, z_hz, a_hz, xw_hz, yw_hz, zw_hz, aw_hz, height, dheight, vol) + x_hz, y_hz, z_hz, a_hz, xw_hz, yw_hz, zw_hz, aw_hz, height, dheight, vol, None) if dstFunc is None: self.peaks4D -= 1 @@ -974,22 +1022,27 @@ def exitPeak_4d(self, ctx: NmrPipePKParser.Peak_4dContext): cur_spectral_dim = self.spectral_dim[self.num_of_dim][self.cur_list_id] + cur_spectral_dim[1]['freq_hint'].append(x_ppm) + cur_spectral_dim[2]['freq_hint'].append(y_ppm) + cur_spectral_dim[3]['freq_hint'].append(z_ppm) + cur_spectral_dim[4]['freq_hint'].append(a_ppm) + if x_ppm is not None and x_hz is not None and cur_spectral_dim[1]['spectrometer_frequency'] is None\ and isinstance(cur_spectral_dim[1]['value_first_point'], float): - cur_spectral_dim[1]['freq_hint'].append(float(roundString(str(x_hz / (x_ppm - cur_spectral_dim[1]['value_first_point'])), - getMaxEffDigits([str(x_ppm), str(x_hz)])))) + cur_spectral_dim[1]['obs_freq_hint'].append(float(roundString(str(x_hz / (cur_spectral_dim[1]['value_first_point'] - x_ppm)), + getMaxEffDigits([str(x_ppm), str(x_hz)])))) if y_ppm is not None and y_hz is not None and cur_spectral_dim[2]['spectrometer_frequency'] is None\ and isinstance(cur_spectral_dim[2]['value_first_point'], float): - cur_spectral_dim[2]['freq_hint'].append(float(roundString(str(y_hz / (y_ppm - cur_spectral_dim[2]['value_first_point'])), - getMaxEffDigits([str(y_ppm), str(y_hz)])))) + cur_spectral_dim[2]['obs_freq_hint'].append(float(roundString(str(y_hz / (cur_spectral_dim[2]['value_first_point'] - y_ppm)), + getMaxEffDigits([str(y_ppm), str(y_hz)])))) if z_ppm is not None and z_hz is not None and cur_spectral_dim[3]['spectrometer_frequency'] is None\ and isinstance(cur_spectral_dim[3]['value_first_point'], float): - cur_spectral_dim[3]['freq_hint'].append(float(roundString(str(z_hz / (z_ppm - cur_spectral_dim[3]['value_first_point'])), - getMaxEffDigits([str(z_ppm), str(z_hz)])))) + cur_spectral_dim[3]['obs_freq_hint'].append(float(roundString(str(z_hz / (cur_spectral_dim[3]['value_first_point'] - z_ppm)), + getMaxEffDigits([str(z_ppm), str(z_hz)])))) if a_ppm is not None and a_hz is not None and cur_spectral_dim[4]['spectrometer_frequency'] is None\ and isinstance(cur_spectral_dim[4]['value_first_point'], float): - cur_spectral_dim[4]['freq_hint'].append(float(roundString(str(a_hz / (a_ppm - cur_spectral_dim[4]['value_first_point'])), - getMaxEffDigits([str(a_ppm), str(a_hz)])))) + cur_spectral_dim[4]['obs_freq_hint'].append(float(roundString(str(a_hz / (cur_spectral_dim[4]['value_first_point'] - a_ppm)), + getMaxEffDigits([str(a_ppm), str(a_hz)])))) has_assignments = False diff --git a/wwpdb/utils/nmr/pk/NmrViewPKParser.py b/wwpdb/utils/nmr/pk/NmrViewPKParser.py index 748ccc96..10750d6c 100644 --- a/wwpdb/utils/nmr/pk/NmrViewPKParser.py +++ b/wwpdb/utils/nmr/pk/NmrViewPKParser.py @@ -10,146 +10,148 @@ def serializedATN(): return [ - 4,1,33,416,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,6,7, + 4,1,33,420,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,6,7, 6,2,7,7,7,2,8,7,8,2,9,7,9,2,10,7,10,2,11,7,11,2,12,7,12,2,13,7,13, 2,14,7,14,2,15,7,15,1,0,1,0,1,0,1,0,1,0,1,0,1,0,5,0,40,8,0,10,0, - 12,0,43,9,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,2,4,2,62,8,2,11,2,12,2,63,1,3,1,3,1,3,1,3,1,3,1,3, - 1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,3,3,84,8,3,1,3,1, - 3,3,3,88,8,3,1,3,4,3,91,8,3,11,3,12,3,92,1,4,1,4,1,4,1,4,1,4,1,4, - 1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,3,4,114,8,4, - 1,4,1,4,1,4,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5, - 1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,3,5,144,8,5,1,5, - 1,5,3,5,148,8,5,1,5,4,5,151,8,5,11,5,12,5,152,1,6,1,6,1,6,1,6,1, - 6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1, - 6,1,6,1,6,1,6,1,6,1,6,3,6,181,8,6,1,6,1,6,1,6,1,7,1,7,1,7,1,7,1, + 12,0,43,9,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,1,55,8,1,11, + 1,12,1,56,1,1,1,1,1,1,1,1,1,1,1,1,1,2,4,2,66,8,2,11,2,12,2,67,1, + 3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1, + 3,1,3,3,3,88,8,3,1,3,1,3,3,3,92,8,3,1,3,4,3,95,8,3,11,3,12,3,96, + 1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4, + 1,4,1,4,1,4,3,4,118,8,4,1,4,1,4,1,4,1,5,1,5,1,5,1,5,1,5,1,5,1,5, + 1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5, + 1,5,1,5,3,5,148,8,5,1,5,1,5,3,5,152,8,5,1,5,4,5,155,8,5,11,5,12, + 5,156,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1, + 6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,3,6,185,8,6,1,6,1, + 6,1,6,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1, 7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1, - 7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,3,7,218,8,7,1,7,1, - 7,3,7,222,8,7,1,7,4,7,225,8,7,11,7,12,7,226,1,8,1,8,1,8,1,8,1,8, + 7,1,7,3,7,222,8,7,1,7,1,7,3,7,226,8,7,1,7,4,7,229,8,7,11,7,12,7, + 230,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8, 1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8, - 1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,3,8,262,8,8,1,8, - 1,8,1,8,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,3,9,279, - 8,9,1,9,1,9,3,9,283,8,9,1,9,4,9,286,8,9,11,9,12,9,287,1,10,1,10, - 1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,3,10,303, - 8,10,1,10,1,10,1,10,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11, - 1,11,1,11,1,11,1,11,1,11,1,11,1,11,3,11,324,8,11,1,11,1,11,3,11, - 328,8,11,1,11,4,11,331,8,11,11,11,12,11,332,1,12,1,12,1,12,1,12, - 1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12, - 3,12,352,8,12,1,12,1,12,1,12,1,13,1,13,1,13,1,13,1,13,1,13,1,13, + 1,8,1,8,3,8,266,8,8,1,8,1,8,1,8,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9, + 1,9,1,9,1,9,1,9,3,9,283,8,9,1,9,1,9,3,9,287,8,9,1,9,4,9,290,8,9, + 11,9,12,9,291,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10, + 1,10,1,10,1,10,3,10,307,8,10,1,10,1,10,1,10,1,11,1,11,1,11,1,11, + 1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,3,11, + 328,8,11,1,11,1,11,3,11,332,8,11,1,11,4,11,335,8,11,11,11,12,11, + 336,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12, + 1,12,1,12,1,12,1,12,1,12,3,12,356,8,12,1,12,1,12,1,12,1,13,1,13, 1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13, - 3,13,377,8,13,1,13,1,13,3,13,381,8,13,1,13,4,13,384,8,13,11,13,12, - 13,385,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1, - 14,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1,14,3,14,409,8,14,1, - 14,1,14,1,14,1,15,1,15,1,15,0,0,16,0,2,4,6,8,10,12,14,16,18,20,22, - 24,26,28,30,0,1,2,0,29,30,33,33,431,0,41,1,0,0,0,2,46,1,0,0,0,4, - 61,1,0,0,0,6,65,1,0,0,0,8,94,1,0,0,0,10,118,1,0,0,0,12,154,1,0,0, - 0,14,185,1,0,0,0,16,228,1,0,0,0,18,266,1,0,0,0,20,289,1,0,0,0,22, - 307,1,0,0,0,24,334,1,0,0,0,26,356,1,0,0,0,28,387,1,0,0,0,30,413, - 1,0,0,0,32,40,3,2,1,0,33,40,3,6,3,0,34,40,3,10,5,0,35,40,3,14,7, - 0,36,40,3,18,9,0,37,40,3,22,11,0,38,40,3,26,13,0,39,32,1,0,0,0,39, - 33,1,0,0,0,39,34,1,0,0,0,39,35,1,0,0,0,39,36,1,0,0,0,39,37,1,0,0, - 0,39,38,1,0,0,0,40,43,1,0,0,0,41,39,1,0,0,0,41,42,1,0,0,0,42,44, - 1,0,0,0,43,41,1,0,0,0,44,45,5,0,0,1,45,1,1,0,0,0,46,47,5,1,0,0,47, - 48,5,14,0,0,48,49,5,15,0,0,49,50,5,16,0,0,50,51,5,32,0,0,51,52,3, - 4,2,0,52,53,5,32,0,0,53,54,5,29,0,0,54,55,5,32,0,0,55,56,3,4,2,0, - 56,57,5,32,0,0,57,58,3,4,2,0,58,59,5,32,0,0,59,3,1,0,0,0,60,62,3, - 30,15,0,61,60,1,0,0,0,62,63,1,0,0,0,63,61,1,0,0,0,63,64,1,0,0,0, - 64,5,1,0,0,0,65,66,5,17,0,0,66,67,5,18,0,0,67,68,5,19,0,0,68,69, - 5,20,0,0,69,70,5,21,0,0,70,71,5,22,0,0,71,72,5,23,0,0,72,73,5,17, - 0,0,73,74,5,18,0,0,74,75,5,19,0,0,75,76,5,20,0,0,76,77,5,21,0,0, - 77,78,5,22,0,0,78,79,5,23,0,0,79,80,5,24,0,0,80,81,5,25,0,0,81,83, - 5,26,0,0,82,84,5,27,0,0,83,82,1,0,0,0,83,84,1,0,0,0,84,85,1,0,0, - 0,85,87,5,28,0,0,86,88,5,10,0,0,87,86,1,0,0,0,87,88,1,0,0,0,88,90, - 1,0,0,0,89,91,3,8,4,0,90,89,1,0,0,0,91,92,1,0,0,0,92,90,1,0,0,0, - 92,93,1,0,0,0,93,7,1,0,0,0,94,95,5,2,0,0,95,96,5,11,0,0,96,97,5, - 3,0,0,97,98,5,3,0,0,98,99,5,3,0,0,99,100,5,8,0,0,100,101,5,11,0, - 0,101,102,5,11,0,0,102,103,5,11,0,0,103,104,5,3,0,0,104,105,5,3, - 0,0,105,106,5,3,0,0,106,107,5,8,0,0,107,108,5,11,0,0,108,109,5,11, - 0,0,109,110,5,3,0,0,110,111,5,3,0,0,111,113,5,2,0,0,112,114,5,11, - 0,0,113,112,1,0,0,0,113,114,1,0,0,0,114,115,1,0,0,0,115,116,5,2, - 0,0,116,117,5,10,0,0,117,9,1,0,0,0,118,119,5,17,0,0,119,120,5,18, - 0,0,120,121,5,19,0,0,121,122,5,20,0,0,122,123,5,21,0,0,123,124,5, - 22,0,0,124,125,5,23,0,0,125,126,5,17,0,0,126,127,5,18,0,0,127,128, - 5,19,0,0,128,129,5,20,0,0,129,130,5,21,0,0,130,131,5,22,0,0,131, - 132,5,23,0,0,132,133,5,17,0,0,133,134,5,18,0,0,134,135,5,19,0,0, - 135,136,5,20,0,0,136,137,5,21,0,0,137,138,5,22,0,0,138,139,5,23, - 0,0,139,140,5,24,0,0,140,141,5,25,0,0,141,143,5,26,0,0,142,144,5, - 27,0,0,143,142,1,0,0,0,143,144,1,0,0,0,144,145,1,0,0,0,145,147,5, - 28,0,0,146,148,5,10,0,0,147,146,1,0,0,0,147,148,1,0,0,0,148,150, - 1,0,0,0,149,151,3,12,6,0,150,149,1,0,0,0,151,152,1,0,0,0,152,150, - 1,0,0,0,152,153,1,0,0,0,153,11,1,0,0,0,154,155,5,2,0,0,155,156,5, - 11,0,0,156,157,5,3,0,0,157,158,5,3,0,0,158,159,5,3,0,0,159,160,5, - 8,0,0,160,161,5,11,0,0,161,162,5,11,0,0,162,163,5,11,0,0,163,164, - 5,3,0,0,164,165,5,3,0,0,165,166,5,3,0,0,166,167,5,8,0,0,167,168, - 5,11,0,0,168,169,5,11,0,0,169,170,5,11,0,0,170,171,5,3,0,0,171,172, - 5,3,0,0,172,173,5,3,0,0,173,174,5,8,0,0,174,175,5,11,0,0,175,176, - 5,11,0,0,176,177,5,3,0,0,177,178,5,3,0,0,178,180,5,2,0,0,179,181, - 5,11,0,0,180,179,1,0,0,0,180,181,1,0,0,0,181,182,1,0,0,0,182,183, - 5,2,0,0,183,184,5,10,0,0,184,13,1,0,0,0,185,186,5,17,0,0,186,187, - 5,18,0,0,187,188,5,19,0,0,188,189,5,20,0,0,189,190,5,21,0,0,190, - 191,5,22,0,0,191,192,5,23,0,0,192,193,5,17,0,0,193,194,5,18,0,0, - 194,195,5,19,0,0,195,196,5,20,0,0,196,197,5,21,0,0,197,198,5,22, - 0,0,198,199,5,23,0,0,199,200,5,17,0,0,200,201,5,18,0,0,201,202,5, - 19,0,0,202,203,5,20,0,0,203,204,5,21,0,0,204,205,5,22,0,0,205,206, - 5,23,0,0,206,207,5,17,0,0,207,208,5,18,0,0,208,209,5,19,0,0,209, - 210,5,20,0,0,210,211,5,21,0,0,211,212,5,22,0,0,212,213,5,23,0,0, - 213,214,5,24,0,0,214,215,5,25,0,0,215,217,5,26,0,0,216,218,5,27, - 0,0,217,216,1,0,0,0,217,218,1,0,0,0,218,219,1,0,0,0,219,221,5,28, - 0,0,220,222,5,10,0,0,221,220,1,0,0,0,221,222,1,0,0,0,222,224,1,0, - 0,0,223,225,3,16,8,0,224,223,1,0,0,0,225,226,1,0,0,0,226,224,1,0, - 0,0,226,227,1,0,0,0,227,15,1,0,0,0,228,229,5,2,0,0,229,230,5,11, - 0,0,230,231,5,3,0,0,231,232,5,3,0,0,232,233,5,3,0,0,233,234,5,8, - 0,0,234,235,5,11,0,0,235,236,5,11,0,0,236,237,5,11,0,0,237,238,5, - 3,0,0,238,239,5,3,0,0,239,240,5,3,0,0,240,241,5,8,0,0,241,242,5, - 11,0,0,242,243,5,11,0,0,243,244,5,11,0,0,244,245,5,3,0,0,245,246, - 5,3,0,0,246,247,5,3,0,0,247,248,5,8,0,0,248,249,5,11,0,0,249,250, - 5,11,0,0,250,251,5,11,0,0,251,252,5,3,0,0,252,253,5,3,0,0,253,254, - 5,3,0,0,254,255,5,8,0,0,255,256,5,11,0,0,256,257,5,11,0,0,257,258, - 5,3,0,0,258,259,5,3,0,0,259,261,5,2,0,0,260,262,5,11,0,0,261,260, - 1,0,0,0,261,262,1,0,0,0,262,263,1,0,0,0,263,264,5,2,0,0,264,265, - 5,10,0,0,265,17,1,0,0,0,266,267,5,17,0,0,267,268,5,18,0,0,268,269, - 5,19,0,0,269,270,5,20,0,0,270,271,5,17,0,0,271,272,5,18,0,0,272, - 273,5,19,0,0,273,274,5,20,0,0,274,275,5,24,0,0,275,276,5,25,0,0, - 276,278,5,26,0,0,277,279,5,27,0,0,278,277,1,0,0,0,278,279,1,0,0, - 0,279,280,1,0,0,0,280,282,5,28,0,0,281,283,5,10,0,0,282,281,1,0, - 0,0,282,283,1,0,0,0,283,285,1,0,0,0,284,286,3,20,10,0,285,284,1, - 0,0,0,286,287,1,0,0,0,287,285,1,0,0,0,287,288,1,0,0,0,288,19,1,0, - 0,0,289,290,5,2,0,0,290,291,5,11,0,0,291,292,5,3,0,0,292,293,5,3, - 0,0,293,294,5,3,0,0,294,295,5,11,0,0,295,296,5,3,0,0,296,297,5,3, - 0,0,297,298,5,3,0,0,298,299,5,3,0,0,299,300,5,3,0,0,300,302,5,2, - 0,0,301,303,5,11,0,0,302,301,1,0,0,0,302,303,1,0,0,0,303,304,1,0, - 0,0,304,305,5,2,0,0,305,306,5,10,0,0,306,21,1,0,0,0,307,308,5,17, - 0,0,308,309,5,18,0,0,309,310,5,19,0,0,310,311,5,20,0,0,311,312,5, - 17,0,0,312,313,5,18,0,0,313,314,5,19,0,0,314,315,5,20,0,0,315,316, - 5,17,0,0,316,317,5,18,0,0,317,318,5,19,0,0,318,319,5,20,0,0,319, - 320,5,24,0,0,320,321,5,25,0,0,321,323,5,26,0,0,322,324,5,27,0,0, - 323,322,1,0,0,0,323,324,1,0,0,0,324,325,1,0,0,0,325,327,5,28,0,0, - 326,328,5,10,0,0,327,326,1,0,0,0,327,328,1,0,0,0,328,330,1,0,0,0, - 329,331,3,24,12,0,330,329,1,0,0,0,331,332,1,0,0,0,332,330,1,0,0, - 0,332,333,1,0,0,0,333,23,1,0,0,0,334,335,5,2,0,0,335,336,5,11,0, - 0,336,337,5,3,0,0,337,338,5,3,0,0,338,339,5,3,0,0,339,340,5,11,0, - 0,340,341,5,3,0,0,341,342,5,3,0,0,342,343,5,3,0,0,343,344,5,11,0, - 0,344,345,5,3,0,0,345,346,5,3,0,0,346,347,5,3,0,0,347,348,5,3,0, - 0,348,349,5,3,0,0,349,351,5,2,0,0,350,352,5,11,0,0,351,350,1,0,0, - 0,351,352,1,0,0,0,352,353,1,0,0,0,353,354,5,2,0,0,354,355,5,10,0, - 0,355,25,1,0,0,0,356,357,5,17,0,0,357,358,5,18,0,0,358,359,5,19, - 0,0,359,360,5,20,0,0,360,361,5,17,0,0,361,362,5,18,0,0,362,363,5, - 19,0,0,363,364,5,20,0,0,364,365,5,17,0,0,365,366,5,18,0,0,366,367, - 5,19,0,0,367,368,5,20,0,0,368,369,5,17,0,0,369,370,5,18,0,0,370, - 371,5,19,0,0,371,372,5,20,0,0,372,373,5,24,0,0,373,374,5,25,0,0, - 374,376,5,26,0,0,375,377,5,27,0,0,376,375,1,0,0,0,376,377,1,0,0, - 0,377,378,1,0,0,0,378,380,5,28,0,0,379,381,5,10,0,0,380,379,1,0, - 0,0,380,381,1,0,0,0,381,383,1,0,0,0,382,384,3,28,14,0,383,382,1, - 0,0,0,384,385,1,0,0,0,385,383,1,0,0,0,385,386,1,0,0,0,386,27,1,0, - 0,0,387,388,5,2,0,0,388,389,5,11,0,0,389,390,5,3,0,0,390,391,5,3, - 0,0,391,392,5,3,0,0,392,393,5,11,0,0,393,394,5,3,0,0,394,395,5,3, - 0,0,395,396,5,3,0,0,396,397,5,11,0,0,397,398,5,3,0,0,398,399,5,3, - 0,0,399,400,5,3,0,0,400,401,5,11,0,0,401,402,5,3,0,0,402,403,5,3, - 0,0,403,404,5,3,0,0,404,405,5,3,0,0,405,406,5,3,0,0,406,408,5,2, - 0,0,407,409,5,11,0,0,408,407,1,0,0,0,408,409,1,0,0,0,409,410,1,0, - 0,0,410,411,5,2,0,0,411,412,5,10,0,0,412,29,1,0,0,0,413,414,7,0, - 0,0,414,31,1,0,0,0,27,39,41,63,83,87,92,113,143,147,152,180,217, - 221,226,261,278,282,287,302,323,327,332,351,376,380,385,408 + 1,13,1,13,1,13,1,13,1,13,3,13,381,8,13,1,13,1,13,3,13,385,8,13,1, + 13,4,13,388,8,13,11,13,12,13,389,1,14,1,14,1,14,1,14,1,14,1,14,1, + 14,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1, + 14,1,14,3,14,413,8,14,1,14,1,14,1,14,1,15,1,15,1,15,0,0,16,0,2,4, + 6,8,10,12,14,16,18,20,22,24,26,28,30,0,1,2,0,29,30,33,33,436,0,41, + 1,0,0,0,2,46,1,0,0,0,4,65,1,0,0,0,6,69,1,0,0,0,8,98,1,0,0,0,10,122, + 1,0,0,0,12,158,1,0,0,0,14,189,1,0,0,0,16,232,1,0,0,0,18,270,1,0, + 0,0,20,293,1,0,0,0,22,311,1,0,0,0,24,338,1,0,0,0,26,360,1,0,0,0, + 28,391,1,0,0,0,30,417,1,0,0,0,32,40,3,2,1,0,33,40,3,6,3,0,34,40, + 3,10,5,0,35,40,3,14,7,0,36,40,3,18,9,0,37,40,3,22,11,0,38,40,3,26, + 13,0,39,32,1,0,0,0,39,33,1,0,0,0,39,34,1,0,0,0,39,35,1,0,0,0,39, + 36,1,0,0,0,39,37,1,0,0,0,39,38,1,0,0,0,40,43,1,0,0,0,41,39,1,0,0, + 0,41,42,1,0,0,0,42,44,1,0,0,0,43,41,1,0,0,0,44,45,5,0,0,1,45,1,1, + 0,0,0,46,47,5,1,0,0,47,48,5,14,0,0,48,49,5,15,0,0,49,50,5,16,0,0, + 50,51,5,32,0,0,51,52,3,4,2,0,52,54,5,32,0,0,53,55,5,29,0,0,54,53, + 1,0,0,0,55,56,1,0,0,0,56,54,1,0,0,0,56,57,1,0,0,0,57,58,1,0,0,0, + 58,59,5,32,0,0,59,60,3,4,2,0,60,61,5,32,0,0,61,62,3,4,2,0,62,63, + 5,32,0,0,63,3,1,0,0,0,64,66,3,30,15,0,65,64,1,0,0,0,66,67,1,0,0, + 0,67,65,1,0,0,0,67,68,1,0,0,0,68,5,1,0,0,0,69,70,5,17,0,0,70,71, + 5,18,0,0,71,72,5,19,0,0,72,73,5,20,0,0,73,74,5,21,0,0,74,75,5,22, + 0,0,75,76,5,23,0,0,76,77,5,17,0,0,77,78,5,18,0,0,78,79,5,19,0,0, + 79,80,5,20,0,0,80,81,5,21,0,0,81,82,5,22,0,0,82,83,5,23,0,0,83,84, + 5,24,0,0,84,85,5,25,0,0,85,87,5,26,0,0,86,88,5,27,0,0,87,86,1,0, + 0,0,87,88,1,0,0,0,88,89,1,0,0,0,89,91,5,28,0,0,90,92,5,10,0,0,91, + 90,1,0,0,0,91,92,1,0,0,0,92,94,1,0,0,0,93,95,3,8,4,0,94,93,1,0,0, + 0,95,96,1,0,0,0,96,94,1,0,0,0,96,97,1,0,0,0,97,7,1,0,0,0,98,99,5, + 2,0,0,99,100,5,11,0,0,100,101,5,3,0,0,101,102,5,3,0,0,102,103,5, + 3,0,0,103,104,5,8,0,0,104,105,5,11,0,0,105,106,5,11,0,0,106,107, + 5,11,0,0,107,108,5,3,0,0,108,109,5,3,0,0,109,110,5,3,0,0,110,111, + 5,8,0,0,111,112,5,11,0,0,112,113,5,11,0,0,113,114,5,3,0,0,114,115, + 5,3,0,0,115,117,5,2,0,0,116,118,5,11,0,0,117,116,1,0,0,0,117,118, + 1,0,0,0,118,119,1,0,0,0,119,120,5,2,0,0,120,121,5,10,0,0,121,9,1, + 0,0,0,122,123,5,17,0,0,123,124,5,18,0,0,124,125,5,19,0,0,125,126, + 5,20,0,0,126,127,5,21,0,0,127,128,5,22,0,0,128,129,5,23,0,0,129, + 130,5,17,0,0,130,131,5,18,0,0,131,132,5,19,0,0,132,133,5,20,0,0, + 133,134,5,21,0,0,134,135,5,22,0,0,135,136,5,23,0,0,136,137,5,17, + 0,0,137,138,5,18,0,0,138,139,5,19,0,0,139,140,5,20,0,0,140,141,5, + 21,0,0,141,142,5,22,0,0,142,143,5,23,0,0,143,144,5,24,0,0,144,145, + 5,25,0,0,145,147,5,26,0,0,146,148,5,27,0,0,147,146,1,0,0,0,147,148, + 1,0,0,0,148,149,1,0,0,0,149,151,5,28,0,0,150,152,5,10,0,0,151,150, + 1,0,0,0,151,152,1,0,0,0,152,154,1,0,0,0,153,155,3,12,6,0,154,153, + 1,0,0,0,155,156,1,0,0,0,156,154,1,0,0,0,156,157,1,0,0,0,157,11,1, + 0,0,0,158,159,5,2,0,0,159,160,5,11,0,0,160,161,5,3,0,0,161,162,5, + 3,0,0,162,163,5,3,0,0,163,164,5,8,0,0,164,165,5,11,0,0,165,166,5, + 11,0,0,166,167,5,11,0,0,167,168,5,3,0,0,168,169,5,3,0,0,169,170, + 5,3,0,0,170,171,5,8,0,0,171,172,5,11,0,0,172,173,5,11,0,0,173,174, + 5,11,0,0,174,175,5,3,0,0,175,176,5,3,0,0,176,177,5,3,0,0,177,178, + 5,8,0,0,178,179,5,11,0,0,179,180,5,11,0,0,180,181,5,3,0,0,181,182, + 5,3,0,0,182,184,5,2,0,0,183,185,5,11,0,0,184,183,1,0,0,0,184,185, + 1,0,0,0,185,186,1,0,0,0,186,187,5,2,0,0,187,188,5,10,0,0,188,13, + 1,0,0,0,189,190,5,17,0,0,190,191,5,18,0,0,191,192,5,19,0,0,192,193, + 5,20,0,0,193,194,5,21,0,0,194,195,5,22,0,0,195,196,5,23,0,0,196, + 197,5,17,0,0,197,198,5,18,0,0,198,199,5,19,0,0,199,200,5,20,0,0, + 200,201,5,21,0,0,201,202,5,22,0,0,202,203,5,23,0,0,203,204,5,17, + 0,0,204,205,5,18,0,0,205,206,5,19,0,0,206,207,5,20,0,0,207,208,5, + 21,0,0,208,209,5,22,0,0,209,210,5,23,0,0,210,211,5,17,0,0,211,212, + 5,18,0,0,212,213,5,19,0,0,213,214,5,20,0,0,214,215,5,21,0,0,215, + 216,5,22,0,0,216,217,5,23,0,0,217,218,5,24,0,0,218,219,5,25,0,0, + 219,221,5,26,0,0,220,222,5,27,0,0,221,220,1,0,0,0,221,222,1,0,0, + 0,222,223,1,0,0,0,223,225,5,28,0,0,224,226,5,10,0,0,225,224,1,0, + 0,0,225,226,1,0,0,0,226,228,1,0,0,0,227,229,3,16,8,0,228,227,1,0, + 0,0,229,230,1,0,0,0,230,228,1,0,0,0,230,231,1,0,0,0,231,15,1,0,0, + 0,232,233,5,2,0,0,233,234,5,11,0,0,234,235,5,3,0,0,235,236,5,3,0, + 0,236,237,5,3,0,0,237,238,5,8,0,0,238,239,5,11,0,0,239,240,5,11, + 0,0,240,241,5,11,0,0,241,242,5,3,0,0,242,243,5,3,0,0,243,244,5,3, + 0,0,244,245,5,8,0,0,245,246,5,11,0,0,246,247,5,11,0,0,247,248,5, + 11,0,0,248,249,5,3,0,0,249,250,5,3,0,0,250,251,5,3,0,0,251,252,5, + 8,0,0,252,253,5,11,0,0,253,254,5,11,0,0,254,255,5,11,0,0,255,256, + 5,3,0,0,256,257,5,3,0,0,257,258,5,3,0,0,258,259,5,8,0,0,259,260, + 5,11,0,0,260,261,5,11,0,0,261,262,5,3,0,0,262,263,5,3,0,0,263,265, + 5,2,0,0,264,266,5,11,0,0,265,264,1,0,0,0,265,266,1,0,0,0,266,267, + 1,0,0,0,267,268,5,2,0,0,268,269,5,10,0,0,269,17,1,0,0,0,270,271, + 5,17,0,0,271,272,5,18,0,0,272,273,5,19,0,0,273,274,5,20,0,0,274, + 275,5,17,0,0,275,276,5,18,0,0,276,277,5,19,0,0,277,278,5,20,0,0, + 278,279,5,24,0,0,279,280,5,25,0,0,280,282,5,26,0,0,281,283,5,27, + 0,0,282,281,1,0,0,0,282,283,1,0,0,0,283,284,1,0,0,0,284,286,5,28, + 0,0,285,287,5,10,0,0,286,285,1,0,0,0,286,287,1,0,0,0,287,289,1,0, + 0,0,288,290,3,20,10,0,289,288,1,0,0,0,290,291,1,0,0,0,291,289,1, + 0,0,0,291,292,1,0,0,0,292,19,1,0,0,0,293,294,5,2,0,0,294,295,5,11, + 0,0,295,296,5,3,0,0,296,297,5,3,0,0,297,298,5,3,0,0,298,299,5,11, + 0,0,299,300,5,3,0,0,300,301,5,3,0,0,301,302,5,3,0,0,302,303,5,3, + 0,0,303,304,5,3,0,0,304,306,5,2,0,0,305,307,5,11,0,0,306,305,1,0, + 0,0,306,307,1,0,0,0,307,308,1,0,0,0,308,309,5,2,0,0,309,310,5,10, + 0,0,310,21,1,0,0,0,311,312,5,17,0,0,312,313,5,18,0,0,313,314,5,19, + 0,0,314,315,5,20,0,0,315,316,5,17,0,0,316,317,5,18,0,0,317,318,5, + 19,0,0,318,319,5,20,0,0,319,320,5,17,0,0,320,321,5,18,0,0,321,322, + 5,19,0,0,322,323,5,20,0,0,323,324,5,24,0,0,324,325,5,25,0,0,325, + 327,5,26,0,0,326,328,5,27,0,0,327,326,1,0,0,0,327,328,1,0,0,0,328, + 329,1,0,0,0,329,331,5,28,0,0,330,332,5,10,0,0,331,330,1,0,0,0,331, + 332,1,0,0,0,332,334,1,0,0,0,333,335,3,24,12,0,334,333,1,0,0,0,335, + 336,1,0,0,0,336,334,1,0,0,0,336,337,1,0,0,0,337,23,1,0,0,0,338,339, + 5,2,0,0,339,340,5,11,0,0,340,341,5,3,0,0,341,342,5,3,0,0,342,343, + 5,3,0,0,343,344,5,11,0,0,344,345,5,3,0,0,345,346,5,3,0,0,346,347, + 5,3,0,0,347,348,5,11,0,0,348,349,5,3,0,0,349,350,5,3,0,0,350,351, + 5,3,0,0,351,352,5,3,0,0,352,353,5,3,0,0,353,355,5,2,0,0,354,356, + 5,11,0,0,355,354,1,0,0,0,355,356,1,0,0,0,356,357,1,0,0,0,357,358, + 5,2,0,0,358,359,5,10,0,0,359,25,1,0,0,0,360,361,5,17,0,0,361,362, + 5,18,0,0,362,363,5,19,0,0,363,364,5,20,0,0,364,365,5,17,0,0,365, + 366,5,18,0,0,366,367,5,19,0,0,367,368,5,20,0,0,368,369,5,17,0,0, + 369,370,5,18,0,0,370,371,5,19,0,0,371,372,5,20,0,0,372,373,5,17, + 0,0,373,374,5,18,0,0,374,375,5,19,0,0,375,376,5,20,0,0,376,377,5, + 24,0,0,377,378,5,25,0,0,378,380,5,26,0,0,379,381,5,27,0,0,380,379, + 1,0,0,0,380,381,1,0,0,0,381,382,1,0,0,0,382,384,5,28,0,0,383,385, + 5,10,0,0,384,383,1,0,0,0,384,385,1,0,0,0,385,387,1,0,0,0,386,388, + 3,28,14,0,387,386,1,0,0,0,388,389,1,0,0,0,389,387,1,0,0,0,389,390, + 1,0,0,0,390,27,1,0,0,0,391,392,5,2,0,0,392,393,5,11,0,0,393,394, + 5,3,0,0,394,395,5,3,0,0,395,396,5,3,0,0,396,397,5,11,0,0,397,398, + 5,3,0,0,398,399,5,3,0,0,399,400,5,3,0,0,400,401,5,11,0,0,401,402, + 5,3,0,0,402,403,5,3,0,0,403,404,5,3,0,0,404,405,5,11,0,0,405,406, + 5,3,0,0,406,407,5,3,0,0,407,408,5,3,0,0,408,409,5,3,0,0,409,410, + 5,3,0,0,410,412,5,2,0,0,411,413,5,11,0,0,412,411,1,0,0,0,412,413, + 1,0,0,0,413,414,1,0,0,0,414,415,5,2,0,0,415,416,5,10,0,0,416,29, + 1,0,0,0,417,418,7,0,0,0,418,31,1,0,0,0,28,39,41,56,67,87,91,96,117, + 147,151,156,184,221,225,230,265,282,286,291,306,327,331,336,355, + 380,384,389,412 ] class NmrViewPKParser ( Parser ): @@ -416,8 +418,11 @@ def labels(self, i:int=None): return self.getTypedRuleContext(NmrViewPKParser.LabelsContext,i) - def Simple_name_LA(self): - return self.getToken(NmrViewPKParser.Simple_name_LA, 0) + def Simple_name_LA(self, i:int=None): + if i is None: + return self.getTokens(NmrViewPKParser.Simple_name_LA) + else: + return self.getToken(NmrViewPKParser.Simple_name_LA, i) def getRuleIndex(self): return NmrViewPKParser.RULE_data_label @@ -437,6 +442,7 @@ def data_label(self): localctx = NmrViewPKParser.Data_labelContext(self, self._ctx, self.state) self.enterRule(localctx, 2, self.RULE_data_label) + self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) self.state = 46 @@ -453,17 +459,27 @@ def data_label(self): self.labels() self.state = 52 self.match(NmrViewPKParser.RETURN_LA) - self.state = 53 - self.match(NmrViewPKParser.Simple_name_LA) - self.state = 54 + self.state = 54 + self._errHandler.sync(self) + _la = self._input.LA(1) + while True: + self.state = 53 + self.match(NmrViewPKParser.Simple_name_LA) + self.state = 56 + self._errHandler.sync(self) + _la = self._input.LA(1) + if not (_la==29): + break + + self.state = 58 self.match(NmrViewPKParser.RETURN_LA) - self.state = 55 + self.state = 59 self.labels() - self.state = 56 + self.state = 60 self.match(NmrViewPKParser.RETURN_LA) - self.state = 57 + self.state = 61 self.labels() - self.state = 58 + self.state = 62 self.match(NmrViewPKParser.RETURN_LA) except RecognitionException as re: localctx.exception = re @@ -509,13 +525,13 @@ def labels(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 61 + self.state = 65 self._errHandler.sync(self) _la = self._input.LA(1) while True: - self.state = 60 + self.state = 64 self.label() - self.state = 63 + self.state = 67 self._errHandler.sync(self) _la = self._input.LA(1) if not ((((_la) & ~0x3f) == 0 and ((1 << _la) & 10200547328) != 0)): @@ -625,65 +641,65 @@ def peak_list_2d(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 65 + self.state = 69 self.match(NmrViewPKParser.L_name) - self.state = 66 + self.state = 70 self.match(NmrViewPKParser.P_name) - self.state = 67 + self.state = 71 self.match(NmrViewPKParser.W_name) - self.state = 68 + self.state = 72 self.match(NmrViewPKParser.B_name) - self.state = 69 + self.state = 73 self.match(NmrViewPKParser.E_name) - self.state = 70 + self.state = 74 self.match(NmrViewPKParser.J_name) - self.state = 71 + self.state = 75 self.match(NmrViewPKParser.U_name) - self.state = 72 + self.state = 76 self.match(NmrViewPKParser.L_name) - self.state = 73 + self.state = 77 self.match(NmrViewPKParser.P_name) - self.state = 74 + self.state = 78 self.match(NmrViewPKParser.W_name) - self.state = 75 + self.state = 79 self.match(NmrViewPKParser.B_name) - self.state = 76 + self.state = 80 self.match(NmrViewPKParser.E_name) - self.state = 77 + self.state = 81 self.match(NmrViewPKParser.J_name) - self.state = 78 + self.state = 82 self.match(NmrViewPKParser.U_name) - self.state = 79 + self.state = 83 self.match(NmrViewPKParser.Vol) - self.state = 80 + self.state = 84 self.match(NmrViewPKParser.Int) - self.state = 81 + self.state = 85 self.match(NmrViewPKParser.Stat) - self.state = 83 + self.state = 87 self._errHandler.sync(self) _la = self._input.LA(1) if _la==27: - self.state = 82 + self.state = 86 self.match(NmrViewPKParser.Comment) - self.state = 85 + self.state = 89 self.match(NmrViewPKParser.Flag0) - self.state = 87 + self.state = 91 self._errHandler.sync(self) _la = self._input.LA(1) if _la==10: - self.state = 86 + self.state = 90 self.match(NmrViewPKParser.RETURN) - self.state = 90 + self.state = 94 self._errHandler.sync(self) _la = self._input.LA(1) while True: - self.state = 89 + self.state = 93 self.peak_2d() - self.state = 92 + self.state = 96 self._errHandler.sync(self) _la = self._input.LA(1) if not (_la==2): @@ -753,53 +769,53 @@ def peak_2d(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 94 + self.state = 98 self.match(NmrViewPKParser.Integer) - self.state = 95 + self.state = 99 self.match(NmrViewPKParser.ENCLOSE_DATA) - self.state = 96 + self.state = 100 self.match(NmrViewPKParser.Float) - self.state = 97 + self.state = 101 self.match(NmrViewPKParser.Float) - self.state = 98 + self.state = 102 self.match(NmrViewPKParser.Float) - self.state = 99 + self.state = 103 self.match(NmrViewPKParser.Simple_name) - self.state = 100 + self.state = 104 self.match(NmrViewPKParser.ENCLOSE_DATA) - self.state = 101 + self.state = 105 self.match(NmrViewPKParser.ENCLOSE_DATA) - self.state = 102 + self.state = 106 self.match(NmrViewPKParser.ENCLOSE_DATA) - self.state = 103 + self.state = 107 self.match(NmrViewPKParser.Float) - self.state = 104 + self.state = 108 self.match(NmrViewPKParser.Float) - self.state = 105 + self.state = 109 self.match(NmrViewPKParser.Float) - self.state = 106 + self.state = 110 self.match(NmrViewPKParser.Simple_name) - self.state = 107 + self.state = 111 self.match(NmrViewPKParser.ENCLOSE_DATA) - self.state = 108 + self.state = 112 self.match(NmrViewPKParser.ENCLOSE_DATA) - self.state = 109 + self.state = 113 self.match(NmrViewPKParser.Float) - self.state = 110 + self.state = 114 self.match(NmrViewPKParser.Float) - self.state = 111 + self.state = 115 self.match(NmrViewPKParser.Integer) - self.state = 113 + self.state = 117 self._errHandler.sync(self) _la = self._input.LA(1) if _la==11: - self.state = 112 + self.state = 116 self.match(NmrViewPKParser.ENCLOSE_DATA) - self.state = 115 + self.state = 119 self.match(NmrViewPKParser.Integer) - self.state = 116 + self.state = 120 self.match(NmrViewPKParser.RETURN) except RecognitionException as re: localctx.exception = re @@ -905,79 +921,79 @@ def peak_list_3d(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 118 + self.state = 122 self.match(NmrViewPKParser.L_name) - self.state = 119 + self.state = 123 self.match(NmrViewPKParser.P_name) - self.state = 120 + self.state = 124 self.match(NmrViewPKParser.W_name) - self.state = 121 + self.state = 125 self.match(NmrViewPKParser.B_name) - self.state = 122 + self.state = 126 self.match(NmrViewPKParser.E_name) - self.state = 123 + self.state = 127 self.match(NmrViewPKParser.J_name) - self.state = 124 + self.state = 128 self.match(NmrViewPKParser.U_name) - self.state = 125 + self.state = 129 self.match(NmrViewPKParser.L_name) - self.state = 126 + self.state = 130 self.match(NmrViewPKParser.P_name) - self.state = 127 + self.state = 131 self.match(NmrViewPKParser.W_name) - self.state = 128 + self.state = 132 self.match(NmrViewPKParser.B_name) - self.state = 129 + self.state = 133 self.match(NmrViewPKParser.E_name) - self.state = 130 + self.state = 134 self.match(NmrViewPKParser.J_name) - self.state = 131 + self.state = 135 self.match(NmrViewPKParser.U_name) - self.state = 132 + self.state = 136 self.match(NmrViewPKParser.L_name) - self.state = 133 + self.state = 137 self.match(NmrViewPKParser.P_name) - self.state = 134 + self.state = 138 self.match(NmrViewPKParser.W_name) - self.state = 135 + self.state = 139 self.match(NmrViewPKParser.B_name) - self.state = 136 + self.state = 140 self.match(NmrViewPKParser.E_name) - self.state = 137 + self.state = 141 self.match(NmrViewPKParser.J_name) - self.state = 138 + self.state = 142 self.match(NmrViewPKParser.U_name) - self.state = 139 + self.state = 143 self.match(NmrViewPKParser.Vol) - self.state = 140 + self.state = 144 self.match(NmrViewPKParser.Int) - self.state = 141 + self.state = 145 self.match(NmrViewPKParser.Stat) - self.state = 143 + self.state = 147 self._errHandler.sync(self) _la = self._input.LA(1) if _la==27: - self.state = 142 + self.state = 146 self.match(NmrViewPKParser.Comment) - self.state = 145 + self.state = 149 self.match(NmrViewPKParser.Flag0) - self.state = 147 + self.state = 151 self._errHandler.sync(self) _la = self._input.LA(1) if _la==10: - self.state = 146 + self.state = 150 self.match(NmrViewPKParser.RETURN) - self.state = 150 + self.state = 154 self._errHandler.sync(self) _la = self._input.LA(1) while True: - self.state = 149 + self.state = 153 self.peak_3d() - self.state = 152 + self.state = 156 self._errHandler.sync(self) _la = self._input.LA(1) if not (_la==2): @@ -1047,67 +1063,67 @@ def peak_3d(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 154 + self.state = 158 self.match(NmrViewPKParser.Integer) - self.state = 155 + self.state = 159 self.match(NmrViewPKParser.ENCLOSE_DATA) - self.state = 156 + self.state = 160 self.match(NmrViewPKParser.Float) - self.state = 157 + self.state = 161 self.match(NmrViewPKParser.Float) - self.state = 158 + self.state = 162 self.match(NmrViewPKParser.Float) - self.state = 159 + self.state = 163 self.match(NmrViewPKParser.Simple_name) - self.state = 160 + self.state = 164 self.match(NmrViewPKParser.ENCLOSE_DATA) - self.state = 161 + self.state = 165 self.match(NmrViewPKParser.ENCLOSE_DATA) - self.state = 162 + self.state = 166 self.match(NmrViewPKParser.ENCLOSE_DATA) - self.state = 163 + self.state = 167 self.match(NmrViewPKParser.Float) - self.state = 164 + self.state = 168 self.match(NmrViewPKParser.Float) - self.state = 165 + self.state = 169 self.match(NmrViewPKParser.Float) - self.state = 166 + self.state = 170 self.match(NmrViewPKParser.Simple_name) - self.state = 167 + self.state = 171 self.match(NmrViewPKParser.ENCLOSE_DATA) - self.state = 168 + self.state = 172 self.match(NmrViewPKParser.ENCLOSE_DATA) - self.state = 169 + self.state = 173 self.match(NmrViewPKParser.ENCLOSE_DATA) - self.state = 170 + self.state = 174 self.match(NmrViewPKParser.Float) - self.state = 171 + self.state = 175 self.match(NmrViewPKParser.Float) - self.state = 172 + self.state = 176 self.match(NmrViewPKParser.Float) - self.state = 173 + self.state = 177 self.match(NmrViewPKParser.Simple_name) - self.state = 174 + self.state = 178 self.match(NmrViewPKParser.ENCLOSE_DATA) - self.state = 175 + self.state = 179 self.match(NmrViewPKParser.ENCLOSE_DATA) - self.state = 176 + self.state = 180 self.match(NmrViewPKParser.Float) - self.state = 177 + self.state = 181 self.match(NmrViewPKParser.Float) - self.state = 178 + self.state = 182 self.match(NmrViewPKParser.Integer) - self.state = 180 + self.state = 184 self._errHandler.sync(self) _la = self._input.LA(1) if _la==11: - self.state = 179 + self.state = 183 self.match(NmrViewPKParser.ENCLOSE_DATA) - self.state = 182 + self.state = 186 self.match(NmrViewPKParser.Integer) - self.state = 183 + self.state = 187 self.match(NmrViewPKParser.RETURN) except RecognitionException as re: localctx.exception = re @@ -1213,93 +1229,93 @@ def peak_list_4d(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 185 + self.state = 189 self.match(NmrViewPKParser.L_name) - self.state = 186 + self.state = 190 self.match(NmrViewPKParser.P_name) - self.state = 187 + self.state = 191 self.match(NmrViewPKParser.W_name) - self.state = 188 + self.state = 192 self.match(NmrViewPKParser.B_name) - self.state = 189 + self.state = 193 self.match(NmrViewPKParser.E_name) - self.state = 190 + self.state = 194 self.match(NmrViewPKParser.J_name) - self.state = 191 + self.state = 195 self.match(NmrViewPKParser.U_name) - self.state = 192 + self.state = 196 self.match(NmrViewPKParser.L_name) - self.state = 193 + self.state = 197 self.match(NmrViewPKParser.P_name) - self.state = 194 + self.state = 198 self.match(NmrViewPKParser.W_name) - self.state = 195 + self.state = 199 self.match(NmrViewPKParser.B_name) - self.state = 196 + self.state = 200 self.match(NmrViewPKParser.E_name) - self.state = 197 + self.state = 201 self.match(NmrViewPKParser.J_name) - self.state = 198 + self.state = 202 self.match(NmrViewPKParser.U_name) - self.state = 199 + self.state = 203 self.match(NmrViewPKParser.L_name) - self.state = 200 + self.state = 204 self.match(NmrViewPKParser.P_name) - self.state = 201 + self.state = 205 self.match(NmrViewPKParser.W_name) - self.state = 202 + self.state = 206 self.match(NmrViewPKParser.B_name) - self.state = 203 + self.state = 207 self.match(NmrViewPKParser.E_name) - self.state = 204 + self.state = 208 self.match(NmrViewPKParser.J_name) - self.state = 205 + self.state = 209 self.match(NmrViewPKParser.U_name) - self.state = 206 + self.state = 210 self.match(NmrViewPKParser.L_name) - self.state = 207 + self.state = 211 self.match(NmrViewPKParser.P_name) - self.state = 208 + self.state = 212 self.match(NmrViewPKParser.W_name) - self.state = 209 + self.state = 213 self.match(NmrViewPKParser.B_name) - self.state = 210 + self.state = 214 self.match(NmrViewPKParser.E_name) - self.state = 211 + self.state = 215 self.match(NmrViewPKParser.J_name) - self.state = 212 + self.state = 216 self.match(NmrViewPKParser.U_name) - self.state = 213 + self.state = 217 self.match(NmrViewPKParser.Vol) - self.state = 214 + self.state = 218 self.match(NmrViewPKParser.Int) - self.state = 215 + self.state = 219 self.match(NmrViewPKParser.Stat) - self.state = 217 + self.state = 221 self._errHandler.sync(self) _la = self._input.LA(1) if _la==27: - self.state = 216 + self.state = 220 self.match(NmrViewPKParser.Comment) - self.state = 219 + self.state = 223 self.match(NmrViewPKParser.Flag0) - self.state = 221 + self.state = 225 self._errHandler.sync(self) _la = self._input.LA(1) if _la==10: - self.state = 220 + self.state = 224 self.match(NmrViewPKParser.RETURN) - self.state = 224 + self.state = 228 self._errHandler.sync(self) _la = self._input.LA(1) while True: - self.state = 223 + self.state = 227 self.peak_4d() - self.state = 226 + self.state = 230 self._errHandler.sync(self) _la = self._input.LA(1) if not (_la==2): @@ -1369,81 +1385,81 @@ def peak_4d(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 228 + self.state = 232 self.match(NmrViewPKParser.Integer) - self.state = 229 + self.state = 233 self.match(NmrViewPKParser.ENCLOSE_DATA) - self.state = 230 + self.state = 234 self.match(NmrViewPKParser.Float) - self.state = 231 + self.state = 235 self.match(NmrViewPKParser.Float) - self.state = 232 + self.state = 236 self.match(NmrViewPKParser.Float) - self.state = 233 + self.state = 237 self.match(NmrViewPKParser.Simple_name) - self.state = 234 + self.state = 238 self.match(NmrViewPKParser.ENCLOSE_DATA) - self.state = 235 + self.state = 239 self.match(NmrViewPKParser.ENCLOSE_DATA) - self.state = 236 + self.state = 240 self.match(NmrViewPKParser.ENCLOSE_DATA) - self.state = 237 + self.state = 241 self.match(NmrViewPKParser.Float) - self.state = 238 + self.state = 242 self.match(NmrViewPKParser.Float) - self.state = 239 + self.state = 243 self.match(NmrViewPKParser.Float) - self.state = 240 + self.state = 244 self.match(NmrViewPKParser.Simple_name) - self.state = 241 + self.state = 245 self.match(NmrViewPKParser.ENCLOSE_DATA) - self.state = 242 + self.state = 246 self.match(NmrViewPKParser.ENCLOSE_DATA) - self.state = 243 + self.state = 247 self.match(NmrViewPKParser.ENCLOSE_DATA) - self.state = 244 + self.state = 248 self.match(NmrViewPKParser.Float) - self.state = 245 + self.state = 249 self.match(NmrViewPKParser.Float) - self.state = 246 + self.state = 250 self.match(NmrViewPKParser.Float) - self.state = 247 + self.state = 251 self.match(NmrViewPKParser.Simple_name) - self.state = 248 + self.state = 252 self.match(NmrViewPKParser.ENCLOSE_DATA) - self.state = 249 + self.state = 253 self.match(NmrViewPKParser.ENCLOSE_DATA) - self.state = 250 + self.state = 254 self.match(NmrViewPKParser.ENCLOSE_DATA) - self.state = 251 + self.state = 255 self.match(NmrViewPKParser.Float) - self.state = 252 + self.state = 256 self.match(NmrViewPKParser.Float) - self.state = 253 + self.state = 257 self.match(NmrViewPKParser.Float) - self.state = 254 + self.state = 258 self.match(NmrViewPKParser.Simple_name) - self.state = 255 + self.state = 259 self.match(NmrViewPKParser.ENCLOSE_DATA) - self.state = 256 + self.state = 260 self.match(NmrViewPKParser.ENCLOSE_DATA) - self.state = 257 + self.state = 261 self.match(NmrViewPKParser.Float) - self.state = 258 + self.state = 262 self.match(NmrViewPKParser.Float) - self.state = 259 + self.state = 263 self.match(NmrViewPKParser.Integer) - self.state = 261 + self.state = 265 self._errHandler.sync(self) _la = self._input.LA(1) if _la==11: - self.state = 260 + self.state = 264 self.match(NmrViewPKParser.ENCLOSE_DATA) - self.state = 263 + self.state = 267 self.match(NmrViewPKParser.Integer) - self.state = 264 + self.state = 268 self.match(NmrViewPKParser.RETURN) except RecognitionException as re: localctx.exception = re @@ -1531,14 +1547,6 @@ def peak_list_wo_eju_2d(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 266 - self.match(NmrViewPKParser.L_name) - self.state = 267 - self.match(NmrViewPKParser.P_name) - self.state = 268 - self.match(NmrViewPKParser.W_name) - self.state = 269 - self.match(NmrViewPKParser.B_name) self.state = 270 self.match(NmrViewPKParser.L_name) self.state = 271 @@ -1548,36 +1556,44 @@ def peak_list_wo_eju_2d(self): self.state = 273 self.match(NmrViewPKParser.B_name) self.state = 274 - self.match(NmrViewPKParser.Vol) + self.match(NmrViewPKParser.L_name) self.state = 275 - self.match(NmrViewPKParser.Int) + self.match(NmrViewPKParser.P_name) self.state = 276 - self.match(NmrViewPKParser.Stat) + self.match(NmrViewPKParser.W_name) + self.state = 277 + self.match(NmrViewPKParser.B_name) self.state = 278 + self.match(NmrViewPKParser.Vol) + self.state = 279 + self.match(NmrViewPKParser.Int) + self.state = 280 + self.match(NmrViewPKParser.Stat) + self.state = 282 self._errHandler.sync(self) _la = self._input.LA(1) if _la==27: - self.state = 277 + self.state = 281 self.match(NmrViewPKParser.Comment) - self.state = 280 + self.state = 284 self.match(NmrViewPKParser.Flag0) - self.state = 282 + self.state = 286 self._errHandler.sync(self) _la = self._input.LA(1) if _la==10: - self.state = 281 + self.state = 285 self.match(NmrViewPKParser.RETURN) - self.state = 285 + self.state = 289 self._errHandler.sync(self) _la = self._input.LA(1) while True: - self.state = 284 + self.state = 288 self.peak_wo_eju_2d() - self.state = 287 + self.state = 291 self._errHandler.sync(self) _la = self._input.LA(1) if not (_la==2): @@ -1641,16 +1657,8 @@ def peak_wo_eju_2d(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 289 - self.match(NmrViewPKParser.Integer) - self.state = 290 - self.match(NmrViewPKParser.ENCLOSE_DATA) - self.state = 291 - self.match(NmrViewPKParser.Float) - self.state = 292 - self.match(NmrViewPKParser.Float) self.state = 293 - self.match(NmrViewPKParser.Float) + self.match(NmrViewPKParser.Integer) self.state = 294 self.match(NmrViewPKParser.ENCLOSE_DATA) self.state = 295 @@ -1660,22 +1668,30 @@ def peak_wo_eju_2d(self): self.state = 297 self.match(NmrViewPKParser.Float) self.state = 298 - self.match(NmrViewPKParser.Float) + self.match(NmrViewPKParser.ENCLOSE_DATA) self.state = 299 self.match(NmrViewPKParser.Float) self.state = 300 - self.match(NmrViewPKParser.Integer) + self.match(NmrViewPKParser.Float) + self.state = 301 + self.match(NmrViewPKParser.Float) self.state = 302 + self.match(NmrViewPKParser.Float) + self.state = 303 + self.match(NmrViewPKParser.Float) + self.state = 304 + self.match(NmrViewPKParser.Integer) + self.state = 306 self._errHandler.sync(self) _la = self._input.LA(1) if _la==11: - self.state = 301 + self.state = 305 self.match(NmrViewPKParser.ENCLOSE_DATA) - self.state = 304 + self.state = 308 self.match(NmrViewPKParser.Integer) - self.state = 305 + self.state = 309 self.match(NmrViewPKParser.RETURN) except RecognitionException as re: localctx.exception = re @@ -1763,14 +1779,6 @@ def peak_list_wo_eju_3d(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 307 - self.match(NmrViewPKParser.L_name) - self.state = 308 - self.match(NmrViewPKParser.P_name) - self.state = 309 - self.match(NmrViewPKParser.W_name) - self.state = 310 - self.match(NmrViewPKParser.B_name) self.state = 311 self.match(NmrViewPKParser.L_name) self.state = 312 @@ -1788,36 +1796,44 @@ def peak_list_wo_eju_3d(self): self.state = 318 self.match(NmrViewPKParser.B_name) self.state = 319 - self.match(NmrViewPKParser.Vol) + self.match(NmrViewPKParser.L_name) self.state = 320 - self.match(NmrViewPKParser.Int) + self.match(NmrViewPKParser.P_name) self.state = 321 - self.match(NmrViewPKParser.Stat) + self.match(NmrViewPKParser.W_name) + self.state = 322 + self.match(NmrViewPKParser.B_name) self.state = 323 + self.match(NmrViewPKParser.Vol) + self.state = 324 + self.match(NmrViewPKParser.Int) + self.state = 325 + self.match(NmrViewPKParser.Stat) + self.state = 327 self._errHandler.sync(self) _la = self._input.LA(1) if _la==27: - self.state = 322 + self.state = 326 self.match(NmrViewPKParser.Comment) - self.state = 325 + self.state = 329 self.match(NmrViewPKParser.Flag0) - self.state = 327 + self.state = 331 self._errHandler.sync(self) _la = self._input.LA(1) if _la==10: - self.state = 326 + self.state = 330 self.match(NmrViewPKParser.RETURN) - self.state = 330 + self.state = 334 self._errHandler.sync(self) _la = self._input.LA(1) while True: - self.state = 329 + self.state = 333 self.peak_wo_eju_3d() - self.state = 332 + self.state = 336 self._errHandler.sync(self) _la = self._input.LA(1) if not (_la==2): @@ -1881,16 +1897,8 @@ def peak_wo_eju_3d(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 334 - self.match(NmrViewPKParser.Integer) - self.state = 335 - self.match(NmrViewPKParser.ENCLOSE_DATA) - self.state = 336 - self.match(NmrViewPKParser.Float) - self.state = 337 - self.match(NmrViewPKParser.Float) self.state = 338 - self.match(NmrViewPKParser.Float) + self.match(NmrViewPKParser.Integer) self.state = 339 self.match(NmrViewPKParser.ENCLOSE_DATA) self.state = 340 @@ -1908,22 +1916,30 @@ def peak_wo_eju_3d(self): self.state = 346 self.match(NmrViewPKParser.Float) self.state = 347 - self.match(NmrViewPKParser.Float) + self.match(NmrViewPKParser.ENCLOSE_DATA) self.state = 348 self.match(NmrViewPKParser.Float) self.state = 349 - self.match(NmrViewPKParser.Integer) + self.match(NmrViewPKParser.Float) + self.state = 350 + self.match(NmrViewPKParser.Float) self.state = 351 + self.match(NmrViewPKParser.Float) + self.state = 352 + self.match(NmrViewPKParser.Float) + self.state = 353 + self.match(NmrViewPKParser.Integer) + self.state = 355 self._errHandler.sync(self) _la = self._input.LA(1) if _la==11: - self.state = 350 + self.state = 354 self.match(NmrViewPKParser.ENCLOSE_DATA) - self.state = 353 + self.state = 357 self.match(NmrViewPKParser.Integer) - self.state = 354 + self.state = 358 self.match(NmrViewPKParser.RETURN) except RecognitionException as re: localctx.exception = re @@ -2011,14 +2027,6 @@ def peak_list_wo_eju_4d(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 356 - self.match(NmrViewPKParser.L_name) - self.state = 357 - self.match(NmrViewPKParser.P_name) - self.state = 358 - self.match(NmrViewPKParser.W_name) - self.state = 359 - self.match(NmrViewPKParser.B_name) self.state = 360 self.match(NmrViewPKParser.L_name) self.state = 361 @@ -2044,36 +2052,44 @@ def peak_list_wo_eju_4d(self): self.state = 371 self.match(NmrViewPKParser.B_name) self.state = 372 - self.match(NmrViewPKParser.Vol) + self.match(NmrViewPKParser.L_name) self.state = 373 - self.match(NmrViewPKParser.Int) + self.match(NmrViewPKParser.P_name) self.state = 374 - self.match(NmrViewPKParser.Stat) + self.match(NmrViewPKParser.W_name) + self.state = 375 + self.match(NmrViewPKParser.B_name) self.state = 376 + self.match(NmrViewPKParser.Vol) + self.state = 377 + self.match(NmrViewPKParser.Int) + self.state = 378 + self.match(NmrViewPKParser.Stat) + self.state = 380 self._errHandler.sync(self) _la = self._input.LA(1) if _la==27: - self.state = 375 + self.state = 379 self.match(NmrViewPKParser.Comment) - self.state = 378 + self.state = 382 self.match(NmrViewPKParser.Flag0) - self.state = 380 + self.state = 384 self._errHandler.sync(self) _la = self._input.LA(1) if _la==10: - self.state = 379 + self.state = 383 self.match(NmrViewPKParser.RETURN) - self.state = 383 + self.state = 387 self._errHandler.sync(self) _la = self._input.LA(1) while True: - self.state = 382 + self.state = 386 self.peak_wo_eju_4d() - self.state = 385 + self.state = 389 self._errHandler.sync(self) _la = self._input.LA(1) if not (_la==2): @@ -2137,16 +2153,8 @@ def peak_wo_eju_4d(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 387 - self.match(NmrViewPKParser.Integer) - self.state = 388 - self.match(NmrViewPKParser.ENCLOSE_DATA) - self.state = 389 - self.match(NmrViewPKParser.Float) - self.state = 390 - self.match(NmrViewPKParser.Float) self.state = 391 - self.match(NmrViewPKParser.Float) + self.match(NmrViewPKParser.Integer) self.state = 392 self.match(NmrViewPKParser.ENCLOSE_DATA) self.state = 393 @@ -2172,22 +2180,30 @@ def peak_wo_eju_4d(self): self.state = 403 self.match(NmrViewPKParser.Float) self.state = 404 - self.match(NmrViewPKParser.Float) + self.match(NmrViewPKParser.ENCLOSE_DATA) self.state = 405 self.match(NmrViewPKParser.Float) self.state = 406 - self.match(NmrViewPKParser.Integer) + self.match(NmrViewPKParser.Float) + self.state = 407 + self.match(NmrViewPKParser.Float) self.state = 408 + self.match(NmrViewPKParser.Float) + self.state = 409 + self.match(NmrViewPKParser.Float) + self.state = 410 + self.match(NmrViewPKParser.Integer) + self.state = 412 self._errHandler.sync(self) _la = self._input.LA(1) if _la==11: - self.state = 407 + self.state = 411 self.match(NmrViewPKParser.ENCLOSE_DATA) - self.state = 410 + self.state = 414 self.match(NmrViewPKParser.Integer) - self.state = 411 + self.state = 415 self.match(NmrViewPKParser.RETURN) except RecognitionException as re: localctx.exception = re @@ -2235,7 +2251,7 @@ def label(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 413 + self.state = 417 _la = self._input.LA(1) if not((((_la) & ~0x3f) == 0 and ((1 << _la) & 10200547328) != 0)): self._errHandler.recoverInline(self) diff --git a/wwpdb/utils/nmr/pk/NmrViewPKParserListener.py b/wwpdb/utils/nmr/pk/NmrViewPKParserListener.py index f7e6eeb5..f17d2edd 100644 --- a/wwpdb/utils/nmr/pk/NmrViewPKParserListener.py +++ b/wwpdb/utils/nmr/pk/NmrViewPKParserListener.py @@ -73,12 +73,13 @@ def __init__(self, verbose=True, log=sys.stdout, super().__init__(verbose, log, representativeModelId, representativeAltId, mrAtomNameMapping, cR, caC, ccU, csStat, nefT, reasons) - self.file_type = 'nm-pea-view' + self.file_type = 'nm-pea-vie' self.software_name = 'NMRVIEW' # Enter a parse tree produced by NmrViewPKParser#nmrview_pk. def enterNmrview_pk(self, ctx: NmrViewPKParser.Nmrview_pkContext): # pylint: disable=unused-argument self.num_of_dim = -1 + self.acq_dim_id = 1 self.spectral_dim = {} self.listIdInternal = {} self.chainNumberDict = {} @@ -386,16 +387,45 @@ def exitNmrview_pk(self, ctx: NmrViewPKParser.Nmrview_pkContext): # pylint: dis if len(self.spectral_dim) > 0: for d, v in self.spectral_dim.items(): - for _v in v.values(): + for _id, _v in v.items(): for __d, __v in _v.items(): if 'freq_hint' in __v: + center = np.mean(np.array(__v['freq_hint'])) + + if __v['spectral_region'] is None: + atom_type = __v['atom_type'] + if 125 < center < 130 and atom_type == 'C': + __v['spectral_region'] = 'C_aro' + elif 115 < center < 125 and atom_type == 'N': + __v['spectral_region'] = 'N_ami' + elif 170 < center < 180 and atom_type == 'C': + __v['spectral_region'] = 'CO' + elif 6 < center < 9 and atom_type == 'H': + __v['spectral_region'] = 'H_ami_or_aro' + elif 4 < center < 6 and atom_type == 'H': + __v['spectral_region'] = 'H_all' + elif 60 < center < 90 and atom_type == 'C': + __v['spectral_region'] = 'C_all' + elif 30 < center < 50 and atom_type == 'C': + __v['spectral_region'] = 'C_ali' + if len(__v['freq_hint']) > 0 and d > 2 and __d >= 2\ and self.exptlMethod != 'SOLID-STATE NMR' and __v['atom_isotope_number'] == 13: - center = np.mean(np.array(__v['freq_hint'])) if center < 100.0 and __v['sweep_width'] / __v['spectrometer_frequency'] < 50.0: __v['under_sampling_type'] = 'fold' + del __v['freq_hint'] + for __v in _v.values(): + if __v['spectral_region'] == 'H_ami_or_aro': + has_a = any(___v['spectral_region'] == 'C_aro' for ___v in _v.values()) + __v['spectral_region'] = 'H_aro' if has_a else 'H_ami' + + if self.debug: + print(f'num_of_dim: {d}, list_id: {_id}') + for __d, __v in _v.items(): + print(f'{__d} {__v}') + finally: self.warningMessage = sorted(list(set(self.f)), key=self.f.index) @@ -456,9 +486,12 @@ def exitLabels(self, ctx: NmrViewPKParser.LabelsContext): # pylint: disable=unu isotope_number = cur_spectral_dim['atom_isotope_number'] - cur_spectral_dim['acquisition'] = 'yes' if _dim_id == 1 and (isotope_number == 1 - or (isotope_number == 13 - and self.exptlMethod == 'SOLID-STATE NMR')) else 'no' + cur_spectral_dim['acquisition'] = 'yes' if _dim_id == self.acq_dim_id\ + and (isotope_number == 1 or (isotope_number == 13 and self.exptlMethod == 'SOLID-STATE NMR')) else 'no' + + if _dim_id == 1 and cur_spectral_dim['acquisition'] == 'no': + self.acq_dim_id = self.num_of_dim + cur_spectral_dim['under_sampling_type'] = 'not observed' if cur_spectral_dim['acquisition'] == 'yes' else 'aliased' self.cur_spectral_dim[_dim_id] = cur_spectral_dim @@ -527,8 +560,8 @@ def exitPeak_2d(self, ctx: NmrViewPKParser.Peak_2dContext): # J2 = str(ctx.ENCLOSE_DATA(4))[1:-1] # U2 = str(ctx.ENCLOSE_DATA(5))[1:-1] - vol = float(str(ctx.Float(6))) - _int = float(str(ctx.Float(7))) + vol = str(ctx.Float(6)) + _int = str(ctx.Float(7)) stat = int(str(ctx.Integer(1))) if ctx.ENCLOSE_DATA(6): comment = str(ctx.ENCLOSE_DATA(6))[1:-1] @@ -551,7 +584,7 @@ def exitPeak_2d(self, ctx: NmrViewPKParser.Peak_2dContext): return dstFunc = self.validatePeak2D(index, P1, P2, B1, B2, W1, W2, - None, None, None, None, _int, None, vol) + None, None, None, None, _int, None, vol, None) if dstFunc is None: self.peaks2D -= 1 @@ -565,13 +598,16 @@ def exitPeak_2d(self, ctx: NmrViewPKParser.Peak_2dContext): has_assignments = False if L1 is not None and L2 is not None: - assignments = [None] * self.num_of_dim - assignments[0] = extractPeakAssignment(1, L1, self.authAsymIdSet, self.compIdSet, self.altCompIdSet, - self.polyPeptide, self.polyDeoxyribonucleotide, self.polyRibonucleotide, self.nefT) - assignments[1] = extractPeakAssignment(1, L2, self.authAsymIdSet, self.compIdSet, self.altCompIdSet, - self.polyPeptide, self.polyDeoxyribonucleotide, self.polyRibonucleotide, self.nefT) + assignments = [{}] * self.num_of_dim + try: + assignments[0] = extractPeakAssignment(1, L1, self.authAsymIdSet, self.compIdSet, self.altCompIdSet, + self.polyPeptide, self.polyDeoxyribonucleotide, self.polyRibonucleotide, self.nefT)[0] + assignments[1] = extractPeakAssignment(1, L2, self.authAsymIdSet, self.compIdSet, self.altCompIdSet, + self.polyPeptide, self.polyDeoxyribonucleotide, self.polyRibonucleotide, self.nefT)[0] + except Exception: + pass - if all(a is not None for a in assignments): + if all(len(a) > 0 for a in assignments): self.retrieveLocalSeqScheme() @@ -699,8 +735,8 @@ def exitPeak_3d(self, ctx: NmrViewPKParser.Peak_3dContext): # J3 = str(ctx.ENCLOSE_DATA(7))[1:-1] # U3 = str(ctx.ENCLOSE_DATA(8))[1:-1] - vol = float(str(ctx.Float(9))) - _int = float(str(ctx.Float(10))) + vol = str(ctx.Float(9)) + _int = str(ctx.Float(10)) stat = int(str(ctx.Integer(1))) if ctx.ENCLOSE_DATA(9): comment = str(ctx.ENCLOSE_DATA(9))[1:-1] @@ -725,7 +761,7 @@ def exitPeak_3d(self, ctx: NmrViewPKParser.Peak_3dContext): return dstFunc = self.validatePeak3D(index, P1, P2, P3, B1, B2, B3, W1, W2, W3, - None, None, None, None, None, None, _int, None, vol) + None, None, None, None, None, None, _int, None, vol, None) if dstFunc is None: self.peaks3D -= 1 @@ -740,15 +776,18 @@ def exitPeak_3d(self, ctx: NmrViewPKParser.Peak_3dContext): has_assignments = False if L1 is not None and L2 is not None and L3 is not None: - assignments = [None] * self.num_of_dim - assignments[0] = extractPeakAssignment(1, L1, self.authAsymIdSet, self.compIdSet, self.altCompIdSet, - self.polyPeptide, self.polyDeoxyribonucleotide, self.polyRibonucleotide, self.nefT) - assignments[1] = extractPeakAssignment(1, L2, self.authAsymIdSet, self.compIdSet, self.altCompIdSet, - self.polyPeptide, self.polyDeoxyribonucleotide, self.polyRibonucleotide, self.nefT) - assignments[2] = extractPeakAssignment(1, L3, self.authAsymIdSet, self.compIdSet, self.altCompIdSet, - self.polyPeptide, self.polyDeoxyribonucleotide, self.polyRibonucleotide, self.nefT) - - if all(a is not None for a in assignments): + assignments = [{}] * self.num_of_dim + try: + assignments[0] = extractPeakAssignment(1, L1, self.authAsymIdSet, self.compIdSet, self.altCompIdSet, + self.polyPeptide, self.polyDeoxyribonucleotide, self.polyRibonucleotide, self.nefT)[0] + assignments[1] = extractPeakAssignment(1, L2, self.authAsymIdSet, self.compIdSet, self.altCompIdSet, + self.polyPeptide, self.polyDeoxyribonucleotide, self.polyRibonucleotide, self.nefT)[0] + assignments[2] = extractPeakAssignment(1, L3, self.authAsymIdSet, self.compIdSet, self.altCompIdSet, + self.polyPeptide, self.polyDeoxyribonucleotide, self.polyRibonucleotide, self.nefT)[0] + except Exception: + pass + + if all(len(a) > 0 for a in assignments): self.retrieveLocalSeqScheme() @@ -896,8 +935,8 @@ def exitPeak_4d(self, ctx: NmrViewPKParser.Peak_4dContext): # J4 = str(ctx.ENCLOSE_DATA(10))[1:-1] # U4 = str(ctx.ENCLOSE_DATA(11))[1:-1] - vol = float(str(ctx.Float(12))) - _int = float(str(ctx.Float(13))) + vol = str(ctx.Float(12)) + _int = str(ctx.Float(13)) stat = int(str(ctx.Integer(1))) if ctx.ENCLOSE_DATA(12): comment = str(ctx.ENCLOSE_DATA(12))[1:-1] @@ -924,7 +963,7 @@ def exitPeak_4d(self, ctx: NmrViewPKParser.Peak_4dContext): return dstFunc = self.validatePeak4D(index, P1, P2, P3, P4, B1, B2, B3, B4, W1, W2, W3, W4, - None, None, None, None, None, None, None, None, _int, None, vol) + None, None, None, None, None, None, None, None, _int, None, vol, None) if dstFunc is None: self.peaks4D -= 1 @@ -940,17 +979,20 @@ def exitPeak_4d(self, ctx: NmrViewPKParser.Peak_4dContext): has_assignments = False if L1 is not None and L2 is not None and L3 is not None and L4 is not None: - assignments = [None] * self.num_of_dim - assignments[0] = extractPeakAssignment(1, L1, self.authAsymIdSet, self.compIdSet, self.altCompIdSet, - self.polyPeptide, self.polyDeoxyribonucleotide, self.polyRibonucleotide, self.nefT) - assignments[1] = extractPeakAssignment(1, L2, self.authAsymIdSet, self.compIdSet, self.altCompIdSet, - self.polyPeptide, self.polyDeoxyribonucleotide, self.polyRibonucleotide, self.nefT) - assignments[2] = extractPeakAssignment(1, L3, self.authAsymIdSet, self.compIdSet, self.altCompIdSet, - self.polyPeptide, self.polyDeoxyribonucleotide, self.polyRibonucleotide, self.nefT) - assignments[3] = extractPeakAssignment(1, L4, self.authAsymIdSet, self.compIdSet, self.altCompIdSet, - self.polyPeptide, self.polyDeoxyribonucleotide, self.polyRibonucleotide, self.nefT) - - if all(a is not None for a in assignments): + assignments = [{}] * self.num_of_dim + try: + assignments[0] = extractPeakAssignment(1, L1, self.authAsymIdSet, self.compIdSet, self.altCompIdSet, + self.polyPeptide, self.polyDeoxyribonucleotide, self.polyRibonucleotide, self.nefT)[0] + assignments[1] = extractPeakAssignment(1, L2, self.authAsymIdSet, self.compIdSet, self.altCompIdSet, + self.polyPeptide, self.polyDeoxyribonucleotide, self.polyRibonucleotide, self.nefT)[0] + assignments[2] = extractPeakAssignment(1, L3, self.authAsymIdSet, self.compIdSet, self.altCompIdSet, + self.polyPeptide, self.polyDeoxyribonucleotide, self.polyRibonucleotide, self.nefT)[0] + assignments[3] = extractPeakAssignment(1, L4, self.authAsymIdSet, self.compIdSet, self.altCompIdSet, + self.polyPeptide, self.polyDeoxyribonucleotide, self.polyRibonucleotide, self.nefT)[0] + except Exception: + pass + + if all(len(a) > 0 for a in assignments): self.retrieveLocalSeqScheme() @@ -1067,8 +1109,8 @@ def exitPeak_wo_eju_2d(self, ctx: NmrViewPKParser.Peak_wo_eju_2dContext): W2 = float(str(ctx.Float(4))) B2 = float(str(ctx.Float(5))) - vol = float(str(ctx.Float(6))) - _int = float(str(ctx.Float(7))) + vol = str(ctx.Float(6)) + _int = str(ctx.Float(7)) stat = int(str(ctx.Integer(1))) if ctx.ENCLOSE_DATA(2): comment = str(ctx.ENCLOSE_DATA(2))[1:-1] @@ -1091,7 +1133,7 @@ def exitPeak_wo_eju_2d(self, ctx: NmrViewPKParser.Peak_wo_eju_2dContext): return dstFunc = self.validatePeak2D(index, P1, P2, B1, B2, W1, W2, - None, None, None, None, _int, None, vol) + None, None, None, None, _int, None, vol, None) if dstFunc is None: self.peaks2D -= 1 @@ -1105,13 +1147,16 @@ def exitPeak_wo_eju_2d(self, ctx: NmrViewPKParser.Peak_wo_eju_2dContext): has_assignments = False if L1 is not None and L2 is not None: - assignments = [None] * self.num_of_dim - assignments[0] = extractPeakAssignment(1, L1, self.authAsymIdSet, self.compIdSet, self.altCompIdSet, - self.polyPeptide, self.polyDeoxyribonucleotide, self.polyRibonucleotide, self.nefT) - assignments[1] = extractPeakAssignment(1, L2, self.authAsymIdSet, self.compIdSet, self.altCompIdSet, - self.polyPeptide, self.polyDeoxyribonucleotide, self.polyRibonucleotide, self.nefT) + assignments = [{}] * self.num_of_dim + try: + assignments[0] = extractPeakAssignment(1, L1, self.authAsymIdSet, self.compIdSet, self.altCompIdSet, + self.polyPeptide, self.polyDeoxyribonucleotide, self.polyRibonucleotide, self.nefT)[0] + assignments[1] = extractPeakAssignment(1, L2, self.authAsymIdSet, self.compIdSet, self.altCompIdSet, + self.polyPeptide, self.polyDeoxyribonucleotide, self.polyRibonucleotide, self.nefT)[0] + except Exception: + pass - if all(a is not None for a in assignments): + if all(len(a) > 0 for a in assignments): self.retrieveLocalSeqScheme() @@ -1210,8 +1255,8 @@ def exitPeak_wo_eju_3d(self, ctx: NmrViewPKParser.Peak_wo_eju_3dContext): W3 = float(str(ctx.Float(7))) B3 = float(str(ctx.Float(8))) - vol = float(str(ctx.Float(9))) - _int = float(str(ctx.Float(10))) + vol = str(ctx.Float(9)) + _int = str(ctx.Float(10)) stat = int(str(ctx.Integer(1))) if ctx.ENCLOSE_DATA(3): comment = str(ctx.ENCLOSE_DATA(3))[1:-1] @@ -1236,7 +1281,7 @@ def exitPeak_wo_eju_3d(self, ctx: NmrViewPKParser.Peak_wo_eju_3dContext): return dstFunc = self.validatePeak3D(index, P1, P2, P3, B1, B2, B3, W1, W2, W3, - None, None, None, None, None, None, _int, None, vol) + None, None, None, None, None, None, _int, None, vol, None) if dstFunc is None: self.peaks3D -= 1 @@ -1251,15 +1296,18 @@ def exitPeak_wo_eju_3d(self, ctx: NmrViewPKParser.Peak_wo_eju_3dContext): has_assignments = False if L1 is not None and L2 is not None and L3 is not None: - assignments = [None] * self.num_of_dim - assignments[0] = extractPeakAssignment(1, L1, self.authAsymIdSet, self.compIdSet, self.altCompIdSet, - self.polyPeptide, self.polyDeoxyribonucleotide, self.polyRibonucleotide, self.nefT) - assignments[1] = extractPeakAssignment(1, L2, self.authAsymIdSet, self.compIdSet, self.altCompIdSet, - self.polyPeptide, self.polyDeoxyribonucleotide, self.polyRibonucleotide, self.nefT) - assignments[2] = extractPeakAssignment(1, L3, self.authAsymIdSet, self.compIdSet, self.altCompIdSet, - self.polyPeptide, self.polyDeoxyribonucleotide, self.polyRibonucleotide, self.nefT) - - if all(a is not None for a in assignments): + assignments = [{}] * self.num_of_dim + try: + assignments[0] = extractPeakAssignment(1, L1, self.authAsymIdSet, self.compIdSet, self.altCompIdSet, + self.polyPeptide, self.polyDeoxyribonucleotide, self.polyRibonucleotide, self.nefT)[0] + assignments[1] = extractPeakAssignment(1, L2, self.authAsymIdSet, self.compIdSet, self.altCompIdSet, + self.polyPeptide, self.polyDeoxyribonucleotide, self.polyRibonucleotide, self.nefT)[0] + assignments[2] = extractPeakAssignment(1, L3, self.authAsymIdSet, self.compIdSet, self.altCompIdSet, + self.polyPeptide, self.polyDeoxyribonucleotide, self.polyRibonucleotide, self.nefT)[0] + except Exception: + pass + + if all(len(a) > 0 for a in assignments): self.retrieveLocalSeqScheme() @@ -1375,8 +1423,8 @@ def exitPeak_wo_eju_4d(self, ctx: NmrViewPKParser.Peak_wo_eju_4dContext): W4 = float(str(ctx.Float(10))) B4 = float(str(ctx.Float(11))) - vol = float(str(ctx.Float(12))) - _int = float(str(ctx.Float(13))) + vol = str(ctx.Float(12)) + _int = str(ctx.Float(13)) stat = int(str(ctx.Integer(1))) if ctx.ENCLOSE_DATA(4): comment = str(ctx.ENCLOSE_DATA(4))[1:-1] @@ -1403,7 +1451,7 @@ def exitPeak_wo_eju_4d(self, ctx: NmrViewPKParser.Peak_wo_eju_4dContext): return dstFunc = self.validatePeak4D(index, P1, P2, P3, P4, B1, B2, B3, B4, W1, W2, W3, W4, - None, None, None, None, None, None, None, None, _int, None, vol) + None, None, None, None, None, None, None, None, _int, None, vol, None) if dstFunc is None: self.peaks4D -= 1 @@ -1419,17 +1467,20 @@ def exitPeak_wo_eju_4d(self, ctx: NmrViewPKParser.Peak_wo_eju_4dContext): has_assignments = False if L1 is not None and L2 is not None and L3 is not None and L4 is not None: - assignments = [None] * self.num_of_dim - assignments[0] = extractPeakAssignment(1, L1, self.authAsymIdSet, self.compIdSet, self.altCompIdSet, - self.polyPeptide, self.polyDeoxyribonucleotide, self.polyRibonucleotide, self.nefT) - assignments[1] = extractPeakAssignment(1, L2, self.authAsymIdSet, self.compIdSet, self.altCompIdSet, - self.polyPeptide, self.polyDeoxyribonucleotide, self.polyRibonucleotide, self.nefT) - assignments[2] = extractPeakAssignment(1, L3, self.authAsymIdSet, self.compIdSet, self.altCompIdSet, - self.polyPeptide, self.polyDeoxyribonucleotide, self.polyRibonucleotide, self.nefT) - assignments[3] = extractPeakAssignment(1, L4, self.authAsymIdSet, self.compIdSet, self.altCompIdSet, - self.polyPeptide, self.polyDeoxyribonucleotide, self.polyRibonucleotide, self.nefT) - - if all(a is not None for a in assignments): + assignments = [{}] * self.num_of_dim + try: + assignments[0] = extractPeakAssignment(1, L1, self.authAsymIdSet, self.compIdSet, self.altCompIdSet, + self.polyPeptide, self.polyDeoxyribonucleotide, self.polyRibonucleotide, self.nefT)[0] + assignments[1] = extractPeakAssignment(1, L2, self.authAsymIdSet, self.compIdSet, self.altCompIdSet, + self.polyPeptide, self.polyDeoxyribonucleotide, self.polyRibonucleotide, self.nefT)[0] + assignments[2] = extractPeakAssignment(1, L3, self.authAsymIdSet, self.compIdSet, self.altCompIdSet, + self.polyPeptide, self.polyDeoxyribonucleotide, self.polyRibonucleotide, self.nefT)[0] + assignments[3] = extractPeakAssignment(1, L4, self.authAsymIdSet, self.compIdSet, self.altCompIdSet, + self.polyPeptide, self.polyDeoxyribonucleotide, self.polyRibonucleotide, self.nefT)[0] + except Exception: + pass + + if all(len(a) > 0 for a in assignments): self.retrieveLocalSeqScheme() diff --git a/wwpdb/utils/nmr/pk/XeasyPKLexer.py b/wwpdb/utils/nmr/pk/XeasyPKLexer.py index 6a41d3df..e14950aa 100644 --- a/wwpdb/utils/nmr/pk/XeasyPKLexer.py +++ b/wwpdb/utils/nmr/pk/XeasyPKLexer.py @@ -10,204 +10,193 @@ def serializedATN(): return [ - 4,0,37,527,6,-1,6,-1,6,-1,6,-1,6,-1,6,-1,6,-1,2,0,7,0,2,1,7,1,2, + 4,0,36,500,6,-1,6,-1,6,-1,6,-1,6,-1,6,-1,6,-1,2,0,7,0,2,1,7,1,2, 2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,6,7,6,2,7,7,7,2,8,7,8,2,9,7,9,2, 10,7,10,2,11,7,11,2,12,7,12,2,13,7,13,2,14,7,14,2,15,7,15,2,16,7, 16,2,17,7,17,2,18,7,18,2,19,7,19,2,20,7,20,2,21,7,21,2,22,7,22,2, 23,7,23,2,24,7,24,2,25,7,25,2,26,7,26,2,27,7,27,2,28,7,28,2,29,7, 29,2,30,7,30,2,31,7,31,2,32,7,32,2,33,7,33,2,34,7,34,2,35,7,35,2, 36,7,36,2,37,7,37,2,38,7,38,2,39,7,39,2,40,7,40,2,41,7,41,2,42,7, - 42,2,43,7,43,2,44,7,44,1,0,1,0,5,0,100,8,0,10,0,12,0,103,9,0,1,0, - 1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0, - 1,0,1,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,3,1,3,1,3,1,3,1,3,1,3,1,3, - 1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4, - 1,4,1,4,1,4,1,4,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5, - 1,5,1,6,3,6,188,8,6,1,6,1,6,1,7,3,7,193,8,7,1,7,1,7,3,7,197,8,7, - 1,8,3,8,200,8,8,1,8,1,8,3,8,204,8,8,1,8,1,8,3,8,208,8,8,1,8,3,8, - 211,8,8,1,9,1,9,1,9,1,9,1,9,1,9,3,9,219,8,9,1,10,1,10,1,11,4,11, - 224,8,11,11,11,12,11,225,1,12,4,12,229,8,12,11,12,12,12,230,1,12, - 5,12,234,8,12,10,12,12,12,237,9,12,1,12,5,12,240,8,12,10,12,12,12, - 243,9,12,1,12,5,12,246,8,12,10,12,12,12,249,9,12,1,12,1,12,1,13, - 4,13,254,8,13,11,13,12,13,255,1,13,5,13,259,8,13,10,13,12,13,262, - 9,13,1,13,5,13,265,8,13,10,13,12,13,268,9,13,1,13,5,13,271,8,13, - 10,13,12,13,274,9,13,1,13,1,13,1,14,4,14,279,8,14,11,14,12,14,280, - 1,14,5,14,284,8,14,10,14,12,14,287,9,14,1,14,5,14,290,8,14,10,14, - 12,14,293,9,14,1,14,5,14,296,8,14,10,14,12,14,299,9,14,1,14,1,14, - 1,15,1,15,1,16,1,16,1,17,1,17,3,17,309,8,17,1,18,1,18,3,18,313,8, - 18,1,19,1,19,3,19,317,8,19,1,20,1,20,5,20,321,8,20,10,20,12,20,324, - 9,20,1,21,4,21,327,8,21,11,21,12,21,328,1,21,1,21,1,22,4,22,334, - 8,22,11,22,12,22,335,1,23,1,23,1,23,5,23,341,8,23,10,23,12,23,344, - 9,23,1,23,1,23,1,23,1,23,1,24,1,24,1,24,4,24,353,8,24,11,24,12,24, - 354,1,24,1,24,4,24,359,8,24,11,24,12,24,360,1,24,1,24,4,24,365,8, - 24,11,24,12,24,366,1,24,1,24,1,24,1,24,1,24,1,24,3,24,375,8,24,1, - 24,5,24,378,8,24,10,24,12,24,381,9,24,1,24,1,24,1,24,1,24,1,25,1, - 25,1,25,4,25,390,8,25,11,25,12,25,391,1,25,1,25,4,25,396,8,25,11, - 25,12,25,397,1,25,1,25,4,25,402,8,25,11,25,12,25,403,1,25,1,25,1, - 25,1,25,1,25,1,25,3,25,412,8,25,1,25,5,25,415,8,25,10,25,12,25,418, - 9,25,1,25,1,25,1,25,1,25,1,26,3,26,425,8,26,1,26,1,26,1,27,4,27, - 430,8,27,11,27,12,27,431,1,27,1,27,1,28,4,28,437,8,28,11,28,12,28, - 438,1,28,1,28,1,29,1,29,1,30,4,30,446,8,30,11,30,12,30,447,1,30, - 1,30,1,31,4,31,453,8,31,11,31,12,31,454,1,31,1,31,1,32,3,32,460, - 8,32,1,32,1,32,1,33,1,33,1,34,4,34,467,8,34,11,34,12,34,468,1,34, - 1,34,1,35,4,35,474,8,35,11,35,12,35,475,1,35,1,35,1,36,1,36,1,37, - 4,37,483,8,37,11,37,12,37,484,1,37,1,37,1,38,4,38,490,8,38,11,38, - 12,38,491,1,38,1,38,1,39,1,39,1,40,4,40,499,8,40,11,40,12,40,500, - 1,40,1,40,1,41,4,41,506,8,41,11,41,12,41,507,1,41,1,41,1,42,1,42, - 1,43,4,43,515,8,43,11,43,12,43,516,1,43,1,43,1,44,4,44,522,8,44, - 11,44,12,44,523,1,44,1,44,1,342,0,45,7,1,9,2,11,3,13,4,15,5,17,6, - 19,7,21,8,23,9,25,0,27,0,29,0,31,10,33,11,35,12,37,13,39,0,41,0, - 43,0,45,0,47,0,49,14,51,15,53,16,55,17,57,18,59,19,61,20,63,21,65, - 22,67,23,69,24,71,25,73,26,75,27,77,28,79,29,81,30,83,31,85,32,87, - 33,89,34,91,35,93,36,95,37,7,0,1,2,3,4,5,6,11,2,0,9,10,13,13,2,0, - 43,43,45,45,2,0,69,69,101,101,1,0,48,57,2,0,10,10,13,13,2,0,65,90, - 97,122,5,0,35,35,42,43,45,46,63,63,95,95,2,0,34,34,39,39,3,0,9,10, - 13,13,32,32,5,0,33,33,35,35,38,38,59,59,92,92,2,0,9,9,32,32,572, - 0,7,1,0,0,0,0,9,1,0,0,0,0,11,1,0,0,0,0,13,1,0,0,0,0,15,1,0,0,0,0, - 17,1,0,0,0,0,19,1,0,0,0,0,21,1,0,0,0,0,23,1,0,0,0,0,31,1,0,0,0,0, - 33,1,0,0,0,0,35,1,0,0,0,0,37,1,0,0,0,0,49,1,0,0,0,0,51,1,0,0,0,0, - 53,1,0,0,0,0,55,1,0,0,0,0,57,1,0,0,0,1,59,1,0,0,0,1,61,1,0,0,0,1, - 63,1,0,0,0,2,65,1,0,0,0,2,67,1,0,0,0,2,69,1,0,0,0,3,71,1,0,0,0,3, - 73,1,0,0,0,3,75,1,0,0,0,3,77,1,0,0,0,4,79,1,0,0,0,4,81,1,0,0,0,4, - 83,1,0,0,0,5,85,1,0,0,0,5,87,1,0,0,0,5,89,1,0,0,0,6,91,1,0,0,0,6, - 93,1,0,0,0,6,95,1,0,0,0,7,97,1,0,0,0,9,127,1,0,0,0,11,137,1,0,0, - 0,13,146,1,0,0,0,15,161,1,0,0,0,17,173,1,0,0,0,19,187,1,0,0,0,21, - 192,1,0,0,0,23,199,1,0,0,0,25,218,1,0,0,0,27,220,1,0,0,0,29,223, - 1,0,0,0,31,228,1,0,0,0,33,253,1,0,0,0,35,278,1,0,0,0,37,302,1,0, - 0,0,39,304,1,0,0,0,41,308,1,0,0,0,43,312,1,0,0,0,45,316,1,0,0,0, - 47,318,1,0,0,0,49,326,1,0,0,0,51,333,1,0,0,0,53,337,1,0,0,0,55,374, - 1,0,0,0,57,411,1,0,0,0,59,424,1,0,0,0,61,429,1,0,0,0,63,436,1,0, - 0,0,65,442,1,0,0,0,67,445,1,0,0,0,69,452,1,0,0,0,71,459,1,0,0,0, - 73,463,1,0,0,0,75,466,1,0,0,0,77,473,1,0,0,0,79,479,1,0,0,0,81,482, - 1,0,0,0,83,489,1,0,0,0,85,495,1,0,0,0,87,498,1,0,0,0,89,505,1,0, - 0,0,91,511,1,0,0,0,93,514,1,0,0,0,95,521,1,0,0,0,97,101,5,35,0,0, - 98,100,8,0,0,0,99,98,1,0,0,0,100,103,1,0,0,0,101,99,1,0,0,0,101, - 102,1,0,0,0,102,104,1,0,0,0,103,101,1,0,0,0,104,105,5,78,0,0,105, - 106,5,117,0,0,106,107,5,109,0,0,107,108,5,98,0,0,108,109,5,101,0, - 0,109,110,5,114,0,0,110,111,5,32,0,0,111,112,5,111,0,0,112,113,5, - 102,0,0,113,114,5,32,0,0,114,115,5,100,0,0,115,116,5,105,0,0,116, - 117,5,109,0,0,117,118,5,101,0,0,118,119,5,110,0,0,119,120,5,115, - 0,0,120,121,5,105,0,0,121,122,5,111,0,0,122,123,5,110,0,0,123,124, - 5,115,0,0,124,125,1,0,0,0,125,126,6,0,0,0,126,8,1,0,0,0,127,128, - 5,35,0,0,128,129,5,70,0,0,129,130,5,79,0,0,130,131,5,82,0,0,131, - 132,5,77,0,0,132,133,5,65,0,0,133,134,5,84,0,0,134,135,1,0,0,0,135, - 136,6,1,1,0,136,10,1,0,0,0,137,138,5,35,0,0,138,139,5,73,0,0,139, - 140,5,78,0,0,140,141,5,65,0,0,141,142,5,77,0,0,142,143,5,69,0,0, - 143,144,1,0,0,0,144,145,6,2,2,0,145,12,1,0,0,0,146,147,5,35,0,0, - 147,148,5,67,0,0,148,149,5,89,0,0,149,150,5,65,0,0,150,151,5,78, - 0,0,151,152,5,65,0,0,152,153,5,70,0,0,153,154,5,79,0,0,154,155,5, - 82,0,0,155,156,5,77,0,0,156,157,5,65,0,0,157,158,5,84,0,0,158,159, - 1,0,0,0,159,160,6,3,3,0,160,14,1,0,0,0,161,162,5,35,0,0,162,163, - 5,83,0,0,163,164,5,80,0,0,164,165,5,69,0,0,165,166,5,67,0,0,166, - 167,5,84,0,0,167,168,5,82,0,0,168,169,5,85,0,0,169,170,5,77,0,0, - 170,171,1,0,0,0,171,172,6,4,4,0,172,16,1,0,0,0,173,174,5,35,0,0, - 174,175,5,84,0,0,175,176,5,79,0,0,176,177,5,76,0,0,177,178,5,69, - 0,0,178,179,5,82,0,0,179,180,5,65,0,0,180,181,5,78,0,0,181,182,5, - 67,0,0,182,183,5,69,0,0,183,184,1,0,0,0,184,185,6,5,5,0,185,18,1, - 0,0,0,186,188,7,1,0,0,187,186,1,0,0,0,187,188,1,0,0,0,188,189,1, - 0,0,0,189,190,3,29,11,0,190,20,1,0,0,0,191,193,7,1,0,0,192,191,1, - 0,0,0,192,193,1,0,0,0,193,196,1,0,0,0,194,197,3,29,11,0,195,197, - 3,25,9,0,196,194,1,0,0,0,196,195,1,0,0,0,197,22,1,0,0,0,198,200, - 7,1,0,0,199,198,1,0,0,0,199,200,1,0,0,0,200,203,1,0,0,0,201,204, - 3,29,11,0,202,204,3,25,9,0,203,201,1,0,0,0,203,202,1,0,0,0,204,210, - 1,0,0,0,205,207,7,2,0,0,206,208,7,1,0,0,207,206,1,0,0,0,207,208, - 1,0,0,0,208,209,1,0,0,0,209,211,3,29,11,0,210,205,1,0,0,0,210,211, - 1,0,0,0,211,24,1,0,0,0,212,213,3,29,11,0,213,214,5,46,0,0,214,215, - 3,29,11,0,215,219,1,0,0,0,216,217,5,46,0,0,217,219,3,29,11,0,218, - 212,1,0,0,0,218,216,1,0,0,0,219,26,1,0,0,0,220,221,7,3,0,0,221,28, - 1,0,0,0,222,224,3,27,10,0,223,222,1,0,0,0,224,225,1,0,0,0,225,223, - 1,0,0,0,225,226,1,0,0,0,226,30,1,0,0,0,227,229,5,35,0,0,228,227, - 1,0,0,0,229,230,1,0,0,0,230,228,1,0,0,0,230,231,1,0,0,0,231,235, - 1,0,0,0,232,234,8,4,0,0,233,232,1,0,0,0,234,237,1,0,0,0,235,233, - 1,0,0,0,235,236,1,0,0,0,236,241,1,0,0,0,237,235,1,0,0,0,238,240, - 5,35,0,0,239,238,1,0,0,0,240,243,1,0,0,0,241,239,1,0,0,0,241,242, - 1,0,0,0,242,247,1,0,0,0,243,241,1,0,0,0,244,246,8,4,0,0,245,244, - 1,0,0,0,246,249,1,0,0,0,247,245,1,0,0,0,247,248,1,0,0,0,248,250, - 1,0,0,0,249,247,1,0,0,0,250,251,6,12,6,0,251,32,1,0,0,0,252,254, - 5,33,0,0,253,252,1,0,0,0,254,255,1,0,0,0,255,253,1,0,0,0,255,256, - 1,0,0,0,256,260,1,0,0,0,257,259,8,4,0,0,258,257,1,0,0,0,259,262, - 1,0,0,0,260,258,1,0,0,0,260,261,1,0,0,0,261,266,1,0,0,0,262,260, - 1,0,0,0,263,265,5,33,0,0,264,263,1,0,0,0,265,268,1,0,0,0,266,264, - 1,0,0,0,266,267,1,0,0,0,267,272,1,0,0,0,268,266,1,0,0,0,269,271, - 8,4,0,0,270,269,1,0,0,0,271,274,1,0,0,0,272,270,1,0,0,0,272,273, - 1,0,0,0,273,275,1,0,0,0,274,272,1,0,0,0,275,276,6,13,6,0,276,34, - 1,0,0,0,277,279,5,59,0,0,278,277,1,0,0,0,279,280,1,0,0,0,280,278, - 1,0,0,0,280,281,1,0,0,0,281,285,1,0,0,0,282,284,8,4,0,0,283,282, - 1,0,0,0,284,287,1,0,0,0,285,283,1,0,0,0,285,286,1,0,0,0,286,291, - 1,0,0,0,287,285,1,0,0,0,288,290,5,59,0,0,289,288,1,0,0,0,290,293, - 1,0,0,0,291,289,1,0,0,0,291,292,1,0,0,0,292,297,1,0,0,0,293,291, - 1,0,0,0,294,296,8,4,0,0,295,294,1,0,0,0,296,299,1,0,0,0,297,295, - 1,0,0,0,297,298,1,0,0,0,298,300,1,0,0,0,299,297,1,0,0,0,300,301, - 6,14,6,0,301,36,1,0,0,0,302,303,3,47,20,0,303,38,1,0,0,0,304,305, - 7,5,0,0,305,40,1,0,0,0,306,309,3,39,16,0,307,309,3,27,10,0,308,306, - 1,0,0,0,308,307,1,0,0,0,309,42,1,0,0,0,310,313,3,41,17,0,311,313, - 7,6,0,0,312,310,1,0,0,0,312,311,1,0,0,0,313,44,1,0,0,0,314,317,3, - 43,18,0,315,317,7,7,0,0,316,314,1,0,0,0,316,315,1,0,0,0,317,46,1, - 0,0,0,318,322,3,43,18,0,319,321,3,45,19,0,320,319,1,0,0,0,321,324, - 1,0,0,0,322,320,1,0,0,0,322,323,1,0,0,0,323,48,1,0,0,0,324,322,1, - 0,0,0,325,327,7,8,0,0,326,325,1,0,0,0,327,328,1,0,0,0,328,326,1, - 0,0,0,328,329,1,0,0,0,329,330,1,0,0,0,330,331,6,21,7,0,331,50,1, - 0,0,0,332,334,7,4,0,0,333,332,1,0,0,0,334,335,1,0,0,0,335,333,1, - 0,0,0,335,336,1,0,0,0,336,52,1,0,0,0,337,342,5,123,0,0,338,341,3, - 53,23,0,339,341,9,0,0,0,340,338,1,0,0,0,340,339,1,0,0,0,341,344, - 1,0,0,0,342,343,1,0,0,0,342,340,1,0,0,0,343,345,1,0,0,0,344,342, - 1,0,0,0,345,346,5,125,0,0,346,347,1,0,0,0,347,348,6,23,6,0,348,54, - 1,0,0,0,349,375,7,9,0,0,350,352,5,47,0,0,351,353,5,47,0,0,352,351, - 1,0,0,0,353,354,1,0,0,0,354,352,1,0,0,0,354,355,1,0,0,0,355,375, - 1,0,0,0,356,358,5,42,0,0,357,359,5,42,0,0,358,357,1,0,0,0,359,360, - 1,0,0,0,360,358,1,0,0,0,360,361,1,0,0,0,361,375,1,0,0,0,362,364, - 5,61,0,0,363,365,5,61,0,0,364,363,1,0,0,0,365,366,1,0,0,0,366,364, - 1,0,0,0,366,367,1,0,0,0,367,375,1,0,0,0,368,369,5,82,0,0,369,370, - 5,69,0,0,370,371,5,77,0,0,371,372,5,65,0,0,372,373,5,82,0,0,373, - 375,5,75,0,0,374,349,1,0,0,0,374,350,1,0,0,0,374,356,1,0,0,0,374, - 362,1,0,0,0,374,368,1,0,0,0,375,379,1,0,0,0,376,378,5,32,0,0,377, - 376,1,0,0,0,378,381,1,0,0,0,379,377,1,0,0,0,379,380,1,0,0,0,380, - 382,1,0,0,0,381,379,1,0,0,0,382,383,3,51,22,0,383,384,1,0,0,0,384, - 385,6,24,6,0,385,56,1,0,0,0,386,412,7,9,0,0,387,389,5,47,0,0,388, - 390,5,47,0,0,389,388,1,0,0,0,390,391,1,0,0,0,391,389,1,0,0,0,391, - 392,1,0,0,0,392,412,1,0,0,0,393,395,5,42,0,0,394,396,5,42,0,0,395, - 394,1,0,0,0,396,397,1,0,0,0,397,395,1,0,0,0,397,398,1,0,0,0,398, - 412,1,0,0,0,399,401,5,61,0,0,400,402,5,61,0,0,401,400,1,0,0,0,402, - 403,1,0,0,0,403,401,1,0,0,0,403,404,1,0,0,0,404,412,1,0,0,0,405, - 406,5,82,0,0,406,407,5,69,0,0,407,408,5,77,0,0,408,409,5,65,0,0, - 409,410,5,82,0,0,410,412,5,75,0,0,411,386,1,0,0,0,411,387,1,0,0, - 0,411,393,1,0,0,0,411,399,1,0,0,0,411,405,1,0,0,0,412,416,1,0,0, - 0,413,415,8,4,0,0,414,413,1,0,0,0,415,418,1,0,0,0,416,414,1,0,0, - 0,416,417,1,0,0,0,417,419,1,0,0,0,418,416,1,0,0,0,419,420,3,51,22, - 0,420,421,1,0,0,0,421,422,6,25,6,0,422,58,1,0,0,0,423,425,7,1,0, - 0,424,423,1,0,0,0,424,425,1,0,0,0,425,426,1,0,0,0,426,427,3,29,11, - 0,427,60,1,0,0,0,428,430,7,10,0,0,429,428,1,0,0,0,430,431,1,0,0, - 0,431,429,1,0,0,0,431,432,1,0,0,0,432,433,1,0,0,0,433,434,6,27,7, - 0,434,62,1,0,0,0,435,437,7,4,0,0,436,435,1,0,0,0,437,438,1,0,0,0, - 438,436,1,0,0,0,438,439,1,0,0,0,439,440,1,0,0,0,440,441,6,28,8,0, - 441,64,1,0,0,0,442,443,3,47,20,0,443,66,1,0,0,0,444,446,7,10,0,0, - 445,444,1,0,0,0,446,447,1,0,0,0,447,445,1,0,0,0,447,448,1,0,0,0, - 448,449,1,0,0,0,449,450,6,30,7,0,450,68,1,0,0,0,451,453,7,4,0,0, - 452,451,1,0,0,0,453,454,1,0,0,0,454,452,1,0,0,0,454,455,1,0,0,0, - 455,456,1,0,0,0,456,457,6,31,8,0,457,70,1,0,0,0,458,460,7,1,0,0, - 459,458,1,0,0,0,459,460,1,0,0,0,460,461,1,0,0,0,461,462,3,29,11, - 0,462,72,1,0,0,0,463,464,3,47,20,0,464,74,1,0,0,0,465,467,7,10,0, - 0,466,465,1,0,0,0,467,468,1,0,0,0,468,466,1,0,0,0,468,469,1,0,0, - 0,469,470,1,0,0,0,470,471,6,34,7,0,471,76,1,0,0,0,472,474,7,4,0, - 0,473,472,1,0,0,0,474,475,1,0,0,0,475,473,1,0,0,0,475,476,1,0,0, - 0,476,477,1,0,0,0,477,478,6,35,8,0,478,78,1,0,0,0,479,480,3,47,20, - 0,480,80,1,0,0,0,481,483,7,10,0,0,482,481,1,0,0,0,483,484,1,0,0, - 0,484,482,1,0,0,0,484,485,1,0,0,0,485,486,1,0,0,0,486,487,6,37,7, - 0,487,82,1,0,0,0,488,490,7,4,0,0,489,488,1,0,0,0,490,491,1,0,0,0, - 491,489,1,0,0,0,491,492,1,0,0,0,492,493,1,0,0,0,493,494,6,38,8,0, - 494,84,1,0,0,0,495,496,3,47,20,0,496,86,1,0,0,0,497,499,7,10,0,0, - 498,497,1,0,0,0,499,500,1,0,0,0,500,498,1,0,0,0,500,501,1,0,0,0, - 501,502,1,0,0,0,502,503,6,40,7,0,503,88,1,0,0,0,504,506,7,4,0,0, - 505,504,1,0,0,0,506,507,1,0,0,0,507,505,1,0,0,0,507,508,1,0,0,0, - 508,509,1,0,0,0,509,510,6,41,8,0,510,90,1,0,0,0,511,512,3,21,7,0, - 512,92,1,0,0,0,513,515,7,10,0,0,514,513,1,0,0,0,515,516,1,0,0,0, - 516,514,1,0,0,0,516,517,1,0,0,0,517,518,1,0,0,0,518,519,6,43,7,0, - 519,94,1,0,0,0,520,522,7,4,0,0,521,520,1,0,0,0,522,523,1,0,0,0,523, - 521,1,0,0,0,523,524,1,0,0,0,524,525,1,0,0,0,525,526,6,44,8,0,526, - 96,1,0,0,0,61,0,1,2,3,4,5,6,101,187,192,196,199,203,207,210,218, - 225,230,235,241,247,255,260,266,272,280,285,291,297,308,312,316, - 322,328,335,340,342,354,360,366,374,379,391,397,403,411,416,424, - 431,438,447,454,459,468,475,484,491,500,507,516,523,9,5,1,0,5,2, + 42,2,43,7,43,1,0,1,0,5,0,98,8,0,10,0,12,0,101,9,0,1,0,1,0,1,0,1, + 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, + 0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,2,1, + 2,1,2,1,2,1,2,1,2,1,2,1,2,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1, + 3,1,3,1,3,1,3,1,3,1,3,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1, + 4,1,4,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,6,3, + 6,186,8,6,1,6,1,6,1,7,3,7,191,8,7,1,7,1,7,3,7,195,8,7,1,8,3,8,198, + 8,8,1,8,1,8,3,8,202,8,8,1,8,1,8,3,8,206,8,8,1,8,3,8,209,8,8,1,9, + 1,9,1,9,1,9,1,9,1,9,3,9,217,8,9,1,10,1,10,1,11,4,11,222,8,11,11, + 11,12,11,223,1,12,4,12,227,8,12,11,12,12,12,228,1,12,5,12,232,8, + 12,10,12,12,12,235,9,12,1,12,5,12,238,8,12,10,12,12,12,241,9,12, + 1,12,5,12,244,8,12,10,12,12,12,247,9,12,1,12,1,12,1,13,4,13,252, + 8,13,11,13,12,13,253,1,13,5,13,257,8,13,10,13,12,13,260,9,13,1,13, + 5,13,263,8,13,10,13,12,13,266,9,13,1,13,5,13,269,8,13,10,13,12,13, + 272,9,13,1,13,1,13,1,14,1,14,1,15,1,15,1,16,1,16,3,16,282,8,16,1, + 17,1,17,3,17,286,8,17,1,18,1,18,3,18,290,8,18,1,19,1,19,5,19,294, + 8,19,10,19,12,19,297,9,19,1,20,4,20,300,8,20,11,20,12,20,301,1,20, + 1,20,1,21,4,21,307,8,21,11,21,12,21,308,1,22,1,22,1,22,5,22,314, + 8,22,10,22,12,22,317,9,22,1,22,1,22,1,22,1,22,1,23,1,23,1,23,4,23, + 326,8,23,11,23,12,23,327,1,23,1,23,4,23,332,8,23,11,23,12,23,333, + 1,23,1,23,4,23,338,8,23,11,23,12,23,339,1,23,1,23,1,23,1,23,1,23, + 1,23,3,23,348,8,23,1,23,5,23,351,8,23,10,23,12,23,354,9,23,1,23, + 1,23,1,23,1,23,1,24,1,24,1,24,4,24,363,8,24,11,24,12,24,364,1,24, + 1,24,4,24,369,8,24,11,24,12,24,370,1,24,1,24,4,24,375,8,24,11,24, + 12,24,376,1,24,1,24,1,24,1,24,1,24,1,24,3,24,385,8,24,1,24,5,24, + 388,8,24,10,24,12,24,391,9,24,1,24,1,24,1,24,1,24,1,25,3,25,398, + 8,25,1,25,1,25,1,26,4,26,403,8,26,11,26,12,26,404,1,26,1,26,1,27, + 4,27,410,8,27,11,27,12,27,411,1,27,1,27,1,28,1,28,1,29,4,29,419, + 8,29,11,29,12,29,420,1,29,1,29,1,30,4,30,426,8,30,11,30,12,30,427, + 1,30,1,30,1,31,3,31,433,8,31,1,31,1,31,1,32,1,32,1,33,4,33,440,8, + 33,11,33,12,33,441,1,33,1,33,1,34,4,34,447,8,34,11,34,12,34,448, + 1,34,1,34,1,35,1,35,1,36,4,36,456,8,36,11,36,12,36,457,1,36,1,36, + 1,37,4,37,463,8,37,11,37,12,37,464,1,37,1,37,1,38,1,38,1,39,4,39, + 472,8,39,11,39,12,39,473,1,39,1,39,1,40,4,40,479,8,40,11,40,12,40, + 480,1,40,1,40,1,41,1,41,1,42,4,42,488,8,42,11,42,12,42,489,1,42, + 1,42,1,43,4,43,495,8,43,11,43,12,43,496,1,43,1,43,1,315,0,44,7,1, + 9,2,11,3,13,4,15,5,17,6,19,7,21,8,23,9,25,0,27,0,29,0,31,10,33,11, + 35,12,37,0,39,0,41,0,43,0,45,0,47,13,49,14,51,15,53,16,55,17,57, + 18,59,19,61,20,63,21,65,22,67,23,69,24,71,25,73,26,75,27,77,28,79, + 29,81,30,83,31,85,32,87,33,89,34,91,35,93,36,7,0,1,2,3,4,5,6,11, + 2,0,9,10,13,13,2,0,43,43,45,45,2,0,69,69,101,101,1,0,48,57,2,0,10, + 10,13,13,2,0,65,90,97,122,5,0,35,35,42,43,45,46,63,63,95,95,2,0, + 34,34,39,39,3,0,9,10,13,13,32,32,4,0,33,33,38,38,59,59,92,92,2,0, + 9,9,32,32,541,0,7,1,0,0,0,0,9,1,0,0,0,0,11,1,0,0,0,0,13,1,0,0,0, + 0,15,1,0,0,0,0,17,1,0,0,0,0,19,1,0,0,0,0,21,1,0,0,0,0,23,1,0,0,0, + 0,31,1,0,0,0,0,33,1,0,0,0,0,35,1,0,0,0,0,47,1,0,0,0,0,49,1,0,0,0, + 0,51,1,0,0,0,0,53,1,0,0,0,0,55,1,0,0,0,1,57,1,0,0,0,1,59,1,0,0,0, + 1,61,1,0,0,0,2,63,1,0,0,0,2,65,1,0,0,0,2,67,1,0,0,0,3,69,1,0,0,0, + 3,71,1,0,0,0,3,73,1,0,0,0,3,75,1,0,0,0,4,77,1,0,0,0,4,79,1,0,0,0, + 4,81,1,0,0,0,5,83,1,0,0,0,5,85,1,0,0,0,5,87,1,0,0,0,6,89,1,0,0,0, + 6,91,1,0,0,0,6,93,1,0,0,0,7,95,1,0,0,0,9,125,1,0,0,0,11,135,1,0, + 0,0,13,144,1,0,0,0,15,159,1,0,0,0,17,171,1,0,0,0,19,185,1,0,0,0, + 21,190,1,0,0,0,23,197,1,0,0,0,25,216,1,0,0,0,27,218,1,0,0,0,29,221, + 1,0,0,0,31,226,1,0,0,0,33,251,1,0,0,0,35,275,1,0,0,0,37,277,1,0, + 0,0,39,281,1,0,0,0,41,285,1,0,0,0,43,289,1,0,0,0,45,291,1,0,0,0, + 47,299,1,0,0,0,49,306,1,0,0,0,51,310,1,0,0,0,53,347,1,0,0,0,55,384, + 1,0,0,0,57,397,1,0,0,0,59,402,1,0,0,0,61,409,1,0,0,0,63,415,1,0, + 0,0,65,418,1,0,0,0,67,425,1,0,0,0,69,432,1,0,0,0,71,436,1,0,0,0, + 73,439,1,0,0,0,75,446,1,0,0,0,77,452,1,0,0,0,79,455,1,0,0,0,81,462, + 1,0,0,0,83,468,1,0,0,0,85,471,1,0,0,0,87,478,1,0,0,0,89,484,1,0, + 0,0,91,487,1,0,0,0,93,494,1,0,0,0,95,99,5,35,0,0,96,98,8,0,0,0,97, + 96,1,0,0,0,98,101,1,0,0,0,99,97,1,0,0,0,99,100,1,0,0,0,100,102,1, + 0,0,0,101,99,1,0,0,0,102,103,5,78,0,0,103,104,5,117,0,0,104,105, + 5,109,0,0,105,106,5,98,0,0,106,107,5,101,0,0,107,108,5,114,0,0,108, + 109,5,32,0,0,109,110,5,111,0,0,110,111,5,102,0,0,111,112,5,32,0, + 0,112,113,5,100,0,0,113,114,5,105,0,0,114,115,5,109,0,0,115,116, + 5,101,0,0,116,117,5,110,0,0,117,118,5,115,0,0,118,119,5,105,0,0, + 119,120,5,111,0,0,120,121,5,110,0,0,121,122,5,115,0,0,122,123,1, + 0,0,0,123,124,6,0,0,0,124,8,1,0,0,0,125,126,5,35,0,0,126,127,5,70, + 0,0,127,128,5,79,0,0,128,129,5,82,0,0,129,130,5,77,0,0,130,131,5, + 65,0,0,131,132,5,84,0,0,132,133,1,0,0,0,133,134,6,1,1,0,134,10,1, + 0,0,0,135,136,5,35,0,0,136,137,5,73,0,0,137,138,5,78,0,0,138,139, + 5,65,0,0,139,140,5,77,0,0,140,141,5,69,0,0,141,142,1,0,0,0,142,143, + 6,2,2,0,143,12,1,0,0,0,144,145,5,35,0,0,145,146,5,67,0,0,146,147, + 5,89,0,0,147,148,5,65,0,0,148,149,5,78,0,0,149,150,5,65,0,0,150, + 151,5,70,0,0,151,152,5,79,0,0,152,153,5,82,0,0,153,154,5,77,0,0, + 154,155,5,65,0,0,155,156,5,84,0,0,156,157,1,0,0,0,157,158,6,3,3, + 0,158,14,1,0,0,0,159,160,5,35,0,0,160,161,5,83,0,0,161,162,5,80, + 0,0,162,163,5,69,0,0,163,164,5,67,0,0,164,165,5,84,0,0,165,166,5, + 82,0,0,166,167,5,85,0,0,167,168,5,77,0,0,168,169,1,0,0,0,169,170, + 6,4,4,0,170,16,1,0,0,0,171,172,5,35,0,0,172,173,5,84,0,0,173,174, + 5,79,0,0,174,175,5,76,0,0,175,176,5,69,0,0,176,177,5,82,0,0,177, + 178,5,65,0,0,178,179,5,78,0,0,179,180,5,67,0,0,180,181,5,69,0,0, + 181,182,1,0,0,0,182,183,6,5,5,0,183,18,1,0,0,0,184,186,7,1,0,0,185, + 184,1,0,0,0,185,186,1,0,0,0,186,187,1,0,0,0,187,188,3,29,11,0,188, + 20,1,0,0,0,189,191,7,1,0,0,190,189,1,0,0,0,190,191,1,0,0,0,191,194, + 1,0,0,0,192,195,3,29,11,0,193,195,3,25,9,0,194,192,1,0,0,0,194,193, + 1,0,0,0,195,22,1,0,0,0,196,198,7,1,0,0,197,196,1,0,0,0,197,198,1, + 0,0,0,198,201,1,0,0,0,199,202,3,29,11,0,200,202,3,25,9,0,201,199, + 1,0,0,0,201,200,1,0,0,0,202,208,1,0,0,0,203,205,7,2,0,0,204,206, + 7,1,0,0,205,204,1,0,0,0,205,206,1,0,0,0,206,207,1,0,0,0,207,209, + 3,29,11,0,208,203,1,0,0,0,208,209,1,0,0,0,209,24,1,0,0,0,210,211, + 3,29,11,0,211,212,5,46,0,0,212,213,3,29,11,0,213,217,1,0,0,0,214, + 215,5,46,0,0,215,217,3,29,11,0,216,210,1,0,0,0,216,214,1,0,0,0,217, + 26,1,0,0,0,218,219,7,3,0,0,219,28,1,0,0,0,220,222,3,27,10,0,221, + 220,1,0,0,0,222,223,1,0,0,0,223,221,1,0,0,0,223,224,1,0,0,0,224, + 30,1,0,0,0,225,227,5,33,0,0,226,225,1,0,0,0,227,228,1,0,0,0,228, + 226,1,0,0,0,228,229,1,0,0,0,229,233,1,0,0,0,230,232,8,4,0,0,231, + 230,1,0,0,0,232,235,1,0,0,0,233,231,1,0,0,0,233,234,1,0,0,0,234, + 239,1,0,0,0,235,233,1,0,0,0,236,238,5,33,0,0,237,236,1,0,0,0,238, + 241,1,0,0,0,239,237,1,0,0,0,239,240,1,0,0,0,240,245,1,0,0,0,241, + 239,1,0,0,0,242,244,8,4,0,0,243,242,1,0,0,0,244,247,1,0,0,0,245, + 243,1,0,0,0,245,246,1,0,0,0,246,248,1,0,0,0,247,245,1,0,0,0,248, + 249,6,12,6,0,249,32,1,0,0,0,250,252,5,59,0,0,251,250,1,0,0,0,252, + 253,1,0,0,0,253,251,1,0,0,0,253,254,1,0,0,0,254,258,1,0,0,0,255, + 257,8,4,0,0,256,255,1,0,0,0,257,260,1,0,0,0,258,256,1,0,0,0,258, + 259,1,0,0,0,259,264,1,0,0,0,260,258,1,0,0,0,261,263,5,59,0,0,262, + 261,1,0,0,0,263,266,1,0,0,0,264,262,1,0,0,0,264,265,1,0,0,0,265, + 270,1,0,0,0,266,264,1,0,0,0,267,269,8,4,0,0,268,267,1,0,0,0,269, + 272,1,0,0,0,270,268,1,0,0,0,270,271,1,0,0,0,271,273,1,0,0,0,272, + 270,1,0,0,0,273,274,6,13,6,0,274,34,1,0,0,0,275,276,3,45,19,0,276, + 36,1,0,0,0,277,278,7,5,0,0,278,38,1,0,0,0,279,282,3,37,15,0,280, + 282,3,27,10,0,281,279,1,0,0,0,281,280,1,0,0,0,282,40,1,0,0,0,283, + 286,3,39,16,0,284,286,7,6,0,0,285,283,1,0,0,0,285,284,1,0,0,0,286, + 42,1,0,0,0,287,290,3,41,17,0,288,290,7,7,0,0,289,287,1,0,0,0,289, + 288,1,0,0,0,290,44,1,0,0,0,291,295,3,41,17,0,292,294,3,43,18,0,293, + 292,1,0,0,0,294,297,1,0,0,0,295,293,1,0,0,0,295,296,1,0,0,0,296, + 46,1,0,0,0,297,295,1,0,0,0,298,300,7,8,0,0,299,298,1,0,0,0,300,301, + 1,0,0,0,301,299,1,0,0,0,301,302,1,0,0,0,302,303,1,0,0,0,303,304, + 6,20,7,0,304,48,1,0,0,0,305,307,7,4,0,0,306,305,1,0,0,0,307,308, + 1,0,0,0,308,306,1,0,0,0,308,309,1,0,0,0,309,50,1,0,0,0,310,315,5, + 123,0,0,311,314,3,51,22,0,312,314,9,0,0,0,313,311,1,0,0,0,313,312, + 1,0,0,0,314,317,1,0,0,0,315,316,1,0,0,0,315,313,1,0,0,0,316,318, + 1,0,0,0,317,315,1,0,0,0,318,319,5,125,0,0,319,320,1,0,0,0,320,321, + 6,22,6,0,321,52,1,0,0,0,322,348,7,9,0,0,323,325,5,47,0,0,324,326, + 5,47,0,0,325,324,1,0,0,0,326,327,1,0,0,0,327,325,1,0,0,0,327,328, + 1,0,0,0,328,348,1,0,0,0,329,331,5,42,0,0,330,332,5,42,0,0,331,330, + 1,0,0,0,332,333,1,0,0,0,333,331,1,0,0,0,333,334,1,0,0,0,334,348, + 1,0,0,0,335,337,5,61,0,0,336,338,5,61,0,0,337,336,1,0,0,0,338,339, + 1,0,0,0,339,337,1,0,0,0,339,340,1,0,0,0,340,348,1,0,0,0,341,342, + 5,82,0,0,342,343,5,69,0,0,343,344,5,77,0,0,344,345,5,65,0,0,345, + 346,5,82,0,0,346,348,5,75,0,0,347,322,1,0,0,0,347,323,1,0,0,0,347, + 329,1,0,0,0,347,335,1,0,0,0,347,341,1,0,0,0,348,352,1,0,0,0,349, + 351,5,32,0,0,350,349,1,0,0,0,351,354,1,0,0,0,352,350,1,0,0,0,352, + 353,1,0,0,0,353,355,1,0,0,0,354,352,1,0,0,0,355,356,3,49,21,0,356, + 357,1,0,0,0,357,358,6,23,6,0,358,54,1,0,0,0,359,385,7,9,0,0,360, + 362,5,47,0,0,361,363,5,47,0,0,362,361,1,0,0,0,363,364,1,0,0,0,364, + 362,1,0,0,0,364,365,1,0,0,0,365,385,1,0,0,0,366,368,5,42,0,0,367, + 369,5,42,0,0,368,367,1,0,0,0,369,370,1,0,0,0,370,368,1,0,0,0,370, + 371,1,0,0,0,371,385,1,0,0,0,372,374,5,61,0,0,373,375,5,61,0,0,374, + 373,1,0,0,0,375,376,1,0,0,0,376,374,1,0,0,0,376,377,1,0,0,0,377, + 385,1,0,0,0,378,379,5,82,0,0,379,380,5,69,0,0,380,381,5,77,0,0,381, + 382,5,65,0,0,382,383,5,82,0,0,383,385,5,75,0,0,384,359,1,0,0,0,384, + 360,1,0,0,0,384,366,1,0,0,0,384,372,1,0,0,0,384,378,1,0,0,0,385, + 389,1,0,0,0,386,388,8,4,0,0,387,386,1,0,0,0,388,391,1,0,0,0,389, + 387,1,0,0,0,389,390,1,0,0,0,390,392,1,0,0,0,391,389,1,0,0,0,392, + 393,3,49,21,0,393,394,1,0,0,0,394,395,6,24,6,0,395,56,1,0,0,0,396, + 398,7,1,0,0,397,396,1,0,0,0,397,398,1,0,0,0,398,399,1,0,0,0,399, + 400,3,29,11,0,400,58,1,0,0,0,401,403,7,10,0,0,402,401,1,0,0,0,403, + 404,1,0,0,0,404,402,1,0,0,0,404,405,1,0,0,0,405,406,1,0,0,0,406, + 407,6,26,7,0,407,60,1,0,0,0,408,410,7,4,0,0,409,408,1,0,0,0,410, + 411,1,0,0,0,411,409,1,0,0,0,411,412,1,0,0,0,412,413,1,0,0,0,413, + 414,6,27,8,0,414,62,1,0,0,0,415,416,3,45,19,0,416,64,1,0,0,0,417, + 419,7,10,0,0,418,417,1,0,0,0,419,420,1,0,0,0,420,418,1,0,0,0,420, + 421,1,0,0,0,421,422,1,0,0,0,422,423,6,29,7,0,423,66,1,0,0,0,424, + 426,7,4,0,0,425,424,1,0,0,0,426,427,1,0,0,0,427,425,1,0,0,0,427, + 428,1,0,0,0,428,429,1,0,0,0,429,430,6,30,8,0,430,68,1,0,0,0,431, + 433,7,1,0,0,432,431,1,0,0,0,432,433,1,0,0,0,433,434,1,0,0,0,434, + 435,3,29,11,0,435,70,1,0,0,0,436,437,3,45,19,0,437,72,1,0,0,0,438, + 440,7,10,0,0,439,438,1,0,0,0,440,441,1,0,0,0,441,439,1,0,0,0,441, + 442,1,0,0,0,442,443,1,0,0,0,443,444,6,33,7,0,444,74,1,0,0,0,445, + 447,7,4,0,0,446,445,1,0,0,0,447,448,1,0,0,0,448,446,1,0,0,0,448, + 449,1,0,0,0,449,450,1,0,0,0,450,451,6,34,8,0,451,76,1,0,0,0,452, + 453,3,45,19,0,453,78,1,0,0,0,454,456,7,10,0,0,455,454,1,0,0,0,456, + 457,1,0,0,0,457,455,1,0,0,0,457,458,1,0,0,0,458,459,1,0,0,0,459, + 460,6,36,7,0,460,80,1,0,0,0,461,463,7,4,0,0,462,461,1,0,0,0,463, + 464,1,0,0,0,464,462,1,0,0,0,464,465,1,0,0,0,465,466,1,0,0,0,466, + 467,6,37,8,0,467,82,1,0,0,0,468,469,3,45,19,0,469,84,1,0,0,0,470, + 472,7,10,0,0,471,470,1,0,0,0,472,473,1,0,0,0,473,471,1,0,0,0,473, + 474,1,0,0,0,474,475,1,0,0,0,475,476,6,39,7,0,476,86,1,0,0,0,477, + 479,7,4,0,0,478,477,1,0,0,0,479,480,1,0,0,0,480,478,1,0,0,0,480, + 481,1,0,0,0,481,482,1,0,0,0,482,483,6,40,8,0,483,88,1,0,0,0,484, + 485,3,21,7,0,485,90,1,0,0,0,486,488,7,10,0,0,487,486,1,0,0,0,488, + 489,1,0,0,0,489,487,1,0,0,0,489,490,1,0,0,0,490,491,1,0,0,0,491, + 492,6,42,7,0,492,92,1,0,0,0,493,495,7,4,0,0,494,493,1,0,0,0,495, + 496,1,0,0,0,496,494,1,0,0,0,496,497,1,0,0,0,497,498,1,0,0,0,498, + 499,6,43,8,0,499,94,1,0,0,0,57,0,1,2,3,4,5,6,99,185,190,194,197, + 201,205,208,216,223,228,233,239,245,253,258,264,270,281,285,289, + 295,301,308,313,315,327,333,339,347,352,364,370,376,384,389,397, + 404,411,420,427,432,441,448,457,464,473,480,489,496,9,5,1,0,5,2, 0,5,3,0,5,4,0,5,5,0,5,6,0,0,1,0,6,0,0,4,0,0 ] @@ -233,34 +222,33 @@ class XeasyPKLexer(Lexer): Integer = 7 Float = 8 Real = 9 - SHARP_COMMENT = 10 - EXCLM_COMMENT = 11 - SMCLN_COMMENT = 12 - Simple_name = 13 - SPACE = 14 - RETURN = 15 - ENCLOSE_COMMENT = 16 - SECTION_COMMENT = 17 - LINE_COMMENT = 18 - Integer_ND = 19 - SPACE_ND = 20 - RETURN_ND = 21 - Simple_name_FO = 22 - SPACE_FO = 23 - RETURN_FO = 24 - Integer_IN = 25 - Simple_name_IN = 26 - SPACE_IN = 27 - RETURN_IN = 28 - Simple_name_CY = 29 - SPACE_CY = 30 - RETURN_CY = 31 - Simple_name_SP = 32 - SPACE_SP = 33 - RETURN_SP = 34 - Float_TO = 35 - TOACE_TO = 36 - RETURN_TO = 37 + EXCLM_COMMENT = 10 + SMCLN_COMMENT = 11 + Simple_name = 12 + SPACE = 13 + RETURN = 14 + ENCLOSE_COMMENT = 15 + SECTION_COMMENT = 16 + LINE_COMMENT = 17 + Integer_ND = 18 + SPACE_ND = 19 + RETURN_ND = 20 + Simple_name_FO = 21 + SPACE_FO = 22 + RETURN_FO = 23 + Integer_IN = 24 + Simple_name_IN = 25 + SPACE_IN = 26 + RETURN_IN = 27 + Simple_name_CY = 28 + SPACE_CY = 29 + RETURN_CY = 30 + Simple_name_SP = 31 + SPACE_SP = 32 + RETURN_SP = 33 + Float_TO = 34 + TOACE_TO = 35 + RETURN_TO = 36 channelNames = [ u"DEFAULT_TOKEN_CHANNEL", u"HIDDEN" ] @@ -272,25 +260,23 @@ class XeasyPKLexer(Lexer): symbolicNames = [ "", "Num_of_dim", "Format", "Iname", "Cyana_format", "Spectrum", - "Tolerance", "Integer", "Float", "Real", "SHARP_COMMENT", "EXCLM_COMMENT", - "SMCLN_COMMENT", "Simple_name", "SPACE", "RETURN", "ENCLOSE_COMMENT", - "SECTION_COMMENT", "LINE_COMMENT", "Integer_ND", "SPACE_ND", - "RETURN_ND", "Simple_name_FO", "SPACE_FO", "RETURN_FO", "Integer_IN", - "Simple_name_IN", "SPACE_IN", "RETURN_IN", "Simple_name_CY", - "SPACE_CY", "RETURN_CY", "Simple_name_SP", "SPACE_SP", "RETURN_SP", - "Float_TO", "TOACE_TO", "RETURN_TO" ] + "Tolerance", "Integer", "Float", "Real", "EXCLM_COMMENT", "SMCLN_COMMENT", + "Simple_name", "SPACE", "RETURN", "ENCLOSE_COMMENT", "SECTION_COMMENT", + "LINE_COMMENT", "Integer_ND", "SPACE_ND", "RETURN_ND", "Simple_name_FO", + "SPACE_FO", "RETURN_FO", "Integer_IN", "Simple_name_IN", "SPACE_IN", + "RETURN_IN", "Simple_name_CY", "SPACE_CY", "RETURN_CY", "Simple_name_SP", + "SPACE_SP", "RETURN_SP", "Float_TO", "TOACE_TO", "RETURN_TO" ] ruleNames = [ "Num_of_dim", "Format", "Iname", "Cyana_format", "Spectrum", "Tolerance", "Integer", "Float", "Real", "DEC_DOT_DEC", - "DEC_DIGIT", "DECIMAL", "SHARP_COMMENT", "EXCLM_COMMENT", - "SMCLN_COMMENT", "Simple_name", "ALPHA", "ALPHA_NUM", - "START_CHAR", "NAME_CHAR", "SIMPLE_NAME", "SPACE", "RETURN", - "ENCLOSE_COMMENT", "SECTION_COMMENT", "LINE_COMMENT", - "Integer_ND", "SPACE_ND", "RETURN_ND", "Simple_name_FO", - "SPACE_FO", "RETURN_FO", "Integer_IN", "Simple_name_IN", - "SPACE_IN", "RETURN_IN", "Simple_name_CY", "SPACE_CY", - "RETURN_CY", "Simple_name_SP", "SPACE_SP", "RETURN_SP", - "Float_TO", "TOACE_TO", "RETURN_TO" ] + "DEC_DIGIT", "DECIMAL", "EXCLM_COMMENT", "SMCLN_COMMENT", + "Simple_name", "ALPHA", "ALPHA_NUM", "START_CHAR", "NAME_CHAR", + "SIMPLE_NAME", "SPACE", "RETURN", "ENCLOSE_COMMENT", "SECTION_COMMENT", + "LINE_COMMENT", "Integer_ND", "SPACE_ND", "RETURN_ND", + "Simple_name_FO", "SPACE_FO", "RETURN_FO", "Integer_IN", + "Simple_name_IN", "SPACE_IN", "RETURN_IN", "Simple_name_CY", + "SPACE_CY", "RETURN_CY", "Simple_name_SP", "SPACE_SP", + "RETURN_SP", "Float_TO", "TOACE_TO", "RETURN_TO" ] grammarFileName = "XeasyPKLexer.g4" diff --git a/wwpdb/utils/nmr/pk/XeasyPKParser.py b/wwpdb/utils/nmr/pk/XeasyPKParser.py index 69abac5b..29cf3155 100644 --- a/wwpdb/utils/nmr/pk/XeasyPKParser.py +++ b/wwpdb/utils/nmr/pk/XeasyPKParser.py @@ -10,49 +10,53 @@ def serializedATN(): return [ - 4,1,37,136,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,6,7, + 4,1,36,146,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,6,7, 6,2,7,7,7,2,8,7,8,2,9,7,9,2,10,7,10,2,11,7,11,2,12,7,12,2,13,7,13, - 1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,5,0,37,8,0,10,0,12,0,40,9,0,1,0, - 1,0,1,1,1,1,1,1,1,1,1,2,1,2,1,2,1,2,1,2,1,3,1,3,1,3,1,3,1,4,1,4, - 4,4,59,8,4,11,4,12,4,60,1,4,1,4,1,5,1,5,4,5,67,8,5,11,5,12,5,68, - 1,5,1,5,1,6,4,6,74,8,6,11,6,12,6,75,1,7,1,7,1,7,1,7,1,7,1,7,1,7, - 1,7,1,7,1,7,1,7,1,8,4,8,90,8,8,11,8,12,8,91,1,9,1,9,1,9,1,9,1,9, - 1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,10,4,10,108,8,10,11,10,12,10,109, - 1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11, - 1,11,1,11,1,12,1,12,1,13,1,13,1,13,3,13,132,8,13,3,13,134,8,13,1, - 13,0,0,14,0,2,4,6,8,10,12,14,16,18,20,22,24,26,0,1,2,0,7,9,13,13, - 136,0,38,1,0,0,0,2,43,1,0,0,0,4,47,1,0,0,0,6,52,1,0,0,0,8,56,1,0, - 0,0,10,64,1,0,0,0,12,73,1,0,0,0,14,77,1,0,0,0,16,89,1,0,0,0,18,93, - 1,0,0,0,20,107,1,0,0,0,22,111,1,0,0,0,24,126,1,0,0,0,26,133,1,0, - 0,0,28,37,3,2,1,0,29,37,3,4,2,0,30,37,3,6,3,0,31,37,3,8,4,0,32,37, - 3,10,5,0,33,37,3,12,6,0,34,37,3,16,8,0,35,37,3,20,10,0,36,28,1,0, - 0,0,36,29,1,0,0,0,36,30,1,0,0,0,36,31,1,0,0,0,36,32,1,0,0,0,36,33, - 1,0,0,0,36,34,1,0,0,0,36,35,1,0,0,0,37,40,1,0,0,0,38,36,1,0,0,0, - 38,39,1,0,0,0,39,41,1,0,0,0,40,38,1,0,0,0,41,42,5,0,0,1,42,1,1,0, - 0,0,43,44,5,1,0,0,44,45,5,19,0,0,45,46,5,21,0,0,46,3,1,0,0,0,47, - 48,5,3,0,0,48,49,5,25,0,0,49,50,5,26,0,0,50,51,5,28,0,0,51,5,1,0, - 0,0,52,53,5,4,0,0,53,54,5,29,0,0,54,55,5,31,0,0,55,7,1,0,0,0,56, - 58,5,5,0,0,57,59,5,32,0,0,58,57,1,0,0,0,59,60,1,0,0,0,60,58,1,0, - 0,0,60,61,1,0,0,0,61,62,1,0,0,0,62,63,5,34,0,0,63,9,1,0,0,0,64,66, - 5,6,0,0,65,67,5,35,0,0,66,65,1,0,0,0,67,68,1,0,0,0,68,66,1,0,0,0, - 68,69,1,0,0,0,69,70,1,0,0,0,70,71,5,37,0,0,71,11,1,0,0,0,72,74,3, - 14,7,0,73,72,1,0,0,0,74,75,1,0,0,0,75,73,1,0,0,0,75,76,1,0,0,0,76, - 13,1,0,0,0,77,78,5,7,0,0,78,79,5,8,0,0,79,80,5,8,0,0,80,81,5,7,0, - 0,81,82,5,13,0,0,82,83,3,24,12,0,83,84,3,24,12,0,84,85,5,13,0,0, - 85,86,3,26,13,0,86,87,3,26,13,0,87,15,1,0,0,0,88,90,3,18,9,0,89, - 88,1,0,0,0,90,91,1,0,0,0,91,89,1,0,0,0,91,92,1,0,0,0,92,17,1,0,0, - 0,93,94,5,7,0,0,94,95,5,8,0,0,95,96,5,8,0,0,96,97,5,8,0,0,97,98, - 5,7,0,0,98,99,5,13,0,0,99,100,3,24,12,0,100,101,3,24,12,0,101,102, - 5,13,0,0,102,103,3,26,13,0,103,104,3,26,13,0,104,105,3,26,13,0,105, - 19,1,0,0,0,106,108,3,22,11,0,107,106,1,0,0,0,108,109,1,0,0,0,109, - 107,1,0,0,0,109,110,1,0,0,0,110,21,1,0,0,0,111,112,5,7,0,0,112,113, - 5,8,0,0,113,114,5,8,0,0,114,115,5,8,0,0,115,116,5,8,0,0,116,117, - 5,7,0,0,117,118,5,13,0,0,118,119,3,24,12,0,119,120,3,24,12,0,120, - 121,5,13,0,0,121,122,3,26,13,0,122,123,3,26,13,0,123,124,3,26,13, - 0,124,125,3,26,13,0,125,23,1,0,0,0,126,127,7,0,0,0,127,25,1,0,0, - 0,128,134,5,7,0,0,129,131,5,13,0,0,130,132,5,7,0,0,131,130,1,0,0, - 0,131,132,1,0,0,0,132,134,1,0,0,0,133,128,1,0,0,0,133,129,1,0,0, - 0,134,27,1,0,0,0,9,36,38,60,68,75,91,109,131,133 + 2,14,7,14,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,5,0,40,8,0,10,0,12, + 0,43,9,0,1,0,1,0,1,1,1,1,1,1,1,1,1,2,1,2,1,2,1,2,1,3,1,3,1,3,1,3, + 1,3,1,4,1,4,1,4,1,4,1,5,1,5,4,5,66,8,5,11,5,12,5,67,1,5,1,5,1,6, + 1,6,4,6,74,8,6,11,6,12,6,75,1,6,1,6,1,7,4,7,81,8,7,11,7,12,7,82, + 1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,9,4,9,98,8,9,11, + 9,12,9,99,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10, + 1,10,1,10,1,10,1,11,4,11,117,8,11,11,11,12,11,118,1,12,1,12,1,12, + 1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12, + 1,13,1,13,1,14,1,14,1,14,3,14,142,8,14,3,14,144,8,14,1,14,0,0,15, + 0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,0,1,2,0,7,9,12,12,146,0, + 41,1,0,0,0,2,46,1,0,0,0,4,50,1,0,0,0,6,54,1,0,0,0,8,59,1,0,0,0,10, + 63,1,0,0,0,12,71,1,0,0,0,14,80,1,0,0,0,16,84,1,0,0,0,18,97,1,0,0, + 0,20,101,1,0,0,0,22,116,1,0,0,0,24,120,1,0,0,0,26,136,1,0,0,0,28, + 143,1,0,0,0,30,40,3,2,1,0,31,40,3,4,2,0,32,40,3,6,3,0,33,40,3,8, + 4,0,34,40,3,10,5,0,35,40,3,12,6,0,36,40,3,14,7,0,37,40,3,18,9,0, + 38,40,3,22,11,0,39,30,1,0,0,0,39,31,1,0,0,0,39,32,1,0,0,0,39,33, + 1,0,0,0,39,34,1,0,0,0,39,35,1,0,0,0,39,36,1,0,0,0,39,37,1,0,0,0, + 39,38,1,0,0,0,40,43,1,0,0,0,41,39,1,0,0,0,41,42,1,0,0,0,42,44,1, + 0,0,0,43,41,1,0,0,0,44,45,5,0,0,1,45,1,1,0,0,0,46,47,5,1,0,0,47, + 48,5,18,0,0,48,49,5,20,0,0,49,3,1,0,0,0,50,51,5,2,0,0,51,52,5,21, + 0,0,52,53,5,23,0,0,53,5,1,0,0,0,54,55,5,3,0,0,55,56,5,24,0,0,56, + 57,5,25,0,0,57,58,5,27,0,0,58,7,1,0,0,0,59,60,5,4,0,0,60,61,5,28, + 0,0,61,62,5,30,0,0,62,9,1,0,0,0,63,65,5,5,0,0,64,66,5,31,0,0,65, + 64,1,0,0,0,66,67,1,0,0,0,67,65,1,0,0,0,67,68,1,0,0,0,68,69,1,0,0, + 0,69,70,5,33,0,0,70,11,1,0,0,0,71,73,5,6,0,0,72,74,5,34,0,0,73,72, + 1,0,0,0,74,75,1,0,0,0,75,73,1,0,0,0,75,76,1,0,0,0,76,77,1,0,0,0, + 77,78,5,36,0,0,78,13,1,0,0,0,79,81,3,16,8,0,80,79,1,0,0,0,81,82, + 1,0,0,0,82,80,1,0,0,0,82,83,1,0,0,0,83,15,1,0,0,0,84,85,5,7,0,0, + 85,86,5,8,0,0,86,87,5,8,0,0,87,88,5,7,0,0,88,89,5,12,0,0,89,90,3, + 26,13,0,90,91,3,26,13,0,91,92,5,12,0,0,92,93,5,7,0,0,93,94,3,28, + 14,0,94,95,3,28,14,0,95,17,1,0,0,0,96,98,3,20,10,0,97,96,1,0,0,0, + 98,99,1,0,0,0,99,97,1,0,0,0,99,100,1,0,0,0,100,19,1,0,0,0,101,102, + 5,7,0,0,102,103,5,8,0,0,103,104,5,8,0,0,104,105,5,8,0,0,105,106, + 5,7,0,0,106,107,5,12,0,0,107,108,3,26,13,0,108,109,3,26,13,0,109, + 110,5,12,0,0,110,111,5,7,0,0,111,112,3,28,14,0,112,113,3,28,14,0, + 113,114,3,28,14,0,114,21,1,0,0,0,115,117,3,24,12,0,116,115,1,0,0, + 0,117,118,1,0,0,0,118,116,1,0,0,0,118,119,1,0,0,0,119,23,1,0,0,0, + 120,121,5,7,0,0,121,122,5,8,0,0,122,123,5,8,0,0,123,124,5,8,0,0, + 124,125,5,8,0,0,125,126,5,7,0,0,126,127,5,12,0,0,127,128,3,26,13, + 0,128,129,3,26,13,0,129,130,5,12,0,0,130,131,5,7,0,0,131,132,3,28, + 14,0,132,133,3,28,14,0,133,134,3,28,14,0,134,135,3,28,14,0,135,25, + 1,0,0,0,136,137,7,0,0,0,137,27,1,0,0,0,138,144,5,7,0,0,139,141,5, + 12,0,0,140,142,5,7,0,0,141,140,1,0,0,0,141,142,1,0,0,0,142,144,1, + 0,0,0,143,138,1,0,0,0,143,139,1,0,0,0,144,29,1,0,0,0,9,39,41,67, + 75,82,99,118,141,143 ] class XeasyPKParser ( Parser ): @@ -70,31 +74,32 @@ class XeasyPKParser ( Parser ): symbolicNames = [ "", "Num_of_dim", "Format", "Iname", "Cyana_format", "Spectrum", "Tolerance", "Integer", "Float", "Real", - "SHARP_COMMENT", "EXCLM_COMMENT", "SMCLN_COMMENT", - "Simple_name", "SPACE", "RETURN", "ENCLOSE_COMMENT", - "SECTION_COMMENT", "LINE_COMMENT", "Integer_ND", "SPACE_ND", - "RETURN_ND", "Simple_name_FO", "SPACE_FO", "RETURN_FO", - "Integer_IN", "Simple_name_IN", "SPACE_IN", "RETURN_IN", - "Simple_name_CY", "SPACE_CY", "RETURN_CY", "Simple_name_SP", - "SPACE_SP", "RETURN_SP", "Float_TO", "TOACE_TO", "RETURN_TO" ] + "EXCLM_COMMENT", "SMCLN_COMMENT", "Simple_name", "SPACE", + "RETURN", "ENCLOSE_COMMENT", "SECTION_COMMENT", "LINE_COMMENT", + "Integer_ND", "SPACE_ND", "RETURN_ND", "Simple_name_FO", + "SPACE_FO", "RETURN_FO", "Integer_IN", "Simple_name_IN", + "SPACE_IN", "RETURN_IN", "Simple_name_CY", "SPACE_CY", + "RETURN_CY", "Simple_name_SP", "SPACE_SP", "RETURN_SP", + "Float_TO", "TOACE_TO", "RETURN_TO" ] RULE_xeasy_pk = 0 RULE_dimension = 1 - RULE_iname = 2 - RULE_cyana_format = 3 - RULE_spectrum = 4 - RULE_tolerance = 5 - RULE_peak_list_2d = 6 - RULE_peak_2d = 7 - RULE_peak_list_3d = 8 - RULE_peak_3d = 9 - RULE_peak_list_4d = 10 - RULE_peak_4d = 11 - RULE_number = 12 - RULE_assign = 13 - - ruleNames = [ "xeasy_pk", "dimension", "iname", "cyana_format", "spectrum", - "tolerance", "peak_list_2d", "peak_2d", "peak_list_3d", + RULE_format = 2 + RULE_iname = 3 + RULE_cyana_format = 4 + RULE_spectrum = 5 + RULE_tolerance = 6 + RULE_peak_list_2d = 7 + RULE_peak_2d = 8 + RULE_peak_list_3d = 9 + RULE_peak_3d = 10 + RULE_peak_list_4d = 11 + RULE_peak_4d = 12 + RULE_number = 13 + RULE_assign = 14 + + ruleNames = [ "xeasy_pk", "dimension", "format", "iname", "cyana_format", + "spectrum", "tolerance", "peak_list_2d", "peak_2d", "peak_list_3d", "peak_3d", "peak_list_4d", "peak_4d", "number", "assign" ] EOF = Token.EOF @@ -107,34 +112,33 @@ class XeasyPKParser ( Parser ): Integer=7 Float=8 Real=9 - SHARP_COMMENT=10 - EXCLM_COMMENT=11 - SMCLN_COMMENT=12 - Simple_name=13 - SPACE=14 - RETURN=15 - ENCLOSE_COMMENT=16 - SECTION_COMMENT=17 - LINE_COMMENT=18 - Integer_ND=19 - SPACE_ND=20 - RETURN_ND=21 - Simple_name_FO=22 - SPACE_FO=23 - RETURN_FO=24 - Integer_IN=25 - Simple_name_IN=26 - SPACE_IN=27 - RETURN_IN=28 - Simple_name_CY=29 - SPACE_CY=30 - RETURN_CY=31 - Simple_name_SP=32 - SPACE_SP=33 - RETURN_SP=34 - Float_TO=35 - TOACE_TO=36 - RETURN_TO=37 + EXCLM_COMMENT=10 + SMCLN_COMMENT=11 + Simple_name=12 + SPACE=13 + RETURN=14 + ENCLOSE_COMMENT=15 + SECTION_COMMENT=16 + LINE_COMMENT=17 + Integer_ND=18 + SPACE_ND=19 + RETURN_ND=20 + Simple_name_FO=21 + SPACE_FO=22 + RETURN_FO=23 + Integer_IN=24 + Simple_name_IN=25 + SPACE_IN=26 + RETURN_IN=27 + Simple_name_CY=28 + SPACE_CY=29 + RETURN_CY=30 + Simple_name_SP=31 + SPACE_SP=32 + RETURN_SP=33 + Float_TO=34 + TOACE_TO=35 + RETURN_TO=36 def __init__(self, input:TokenStream, output:TextIO = sys.stdout): super().__init__(input, output) @@ -162,6 +166,13 @@ def dimension(self, i:int=None): return self.getTypedRuleContext(XeasyPKParser.DimensionContext,i) + def format_(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(XeasyPKParser.FormatContext) + else: + return self.getTypedRuleContext(XeasyPKParser.FormatContext,i) + + def iname(self, i:int=None): if i is None: return self.getTypedRuleContexts(XeasyPKParser.InameContext) @@ -232,59 +243,64 @@ def xeasy_pk(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 38 + self.state = 41 self._errHandler.sync(self) _la = self._input.LA(1) - while (((_la) & ~0x3f) == 0 and ((1 << _la) & 250) != 0): - self.state = 36 + while (((_la) & ~0x3f) == 0 and ((1 << _la) & 254) != 0): + self.state = 39 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,0,self._ctx) if la_ == 1: - self.state = 28 + self.state = 30 self.dimension() pass elif la_ == 2: - self.state = 29 - self.iname() + self.state = 31 + self.format_() pass elif la_ == 3: - self.state = 30 - self.cyana_format() + self.state = 32 + self.iname() pass elif la_ == 4: - self.state = 31 - self.spectrum() + self.state = 33 + self.cyana_format() pass elif la_ == 5: - self.state = 32 - self.tolerance() + self.state = 34 + self.spectrum() pass elif la_ == 6: - self.state = 33 - self.peak_list_2d() + self.state = 35 + self.tolerance() pass elif la_ == 7: - self.state = 34 - self.peak_list_3d() + self.state = 36 + self.peak_list_2d() pass elif la_ == 8: - self.state = 35 + self.state = 37 + self.peak_list_3d() + pass + + elif la_ == 9: + self.state = 38 self.peak_list_4d() pass - self.state = 40 + self.state = 43 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 41 + self.state = 44 self.match(XeasyPKParser.EOF) except RecognitionException as re: localctx.exception = re @@ -331,11 +347,11 @@ def dimension(self): self.enterRule(localctx, 2, self.RULE_dimension) try: self.enterOuterAlt(localctx, 1) - self.state = 43 + self.state = 46 self.match(XeasyPKParser.Num_of_dim) - self.state = 44 + self.state = 47 self.match(XeasyPKParser.Integer_ND) - self.state = 45 + self.state = 48 self.match(XeasyPKParser.RETURN_ND) except RecognitionException as re: localctx.exception = re @@ -346,6 +362,57 @@ def dimension(self): return localctx + class FormatContext(ParserRuleContext): + __slots__ = 'parser' + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def Format(self): + return self.getToken(XeasyPKParser.Format, 0) + + def Simple_name_FO(self): + return self.getToken(XeasyPKParser.Simple_name_FO, 0) + + def RETURN_FO(self): + return self.getToken(XeasyPKParser.RETURN_FO, 0) + + def getRuleIndex(self): + return XeasyPKParser.RULE_format + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterFormat" ): + listener.enterFormat(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitFormat" ): + listener.exitFormat(self) + + + + + def format_(self): + + localctx = XeasyPKParser.FormatContext(self, self._ctx, self.state) + self.enterRule(localctx, 4, self.RULE_format) + try: + self.enterOuterAlt(localctx, 1) + self.state = 50 + self.match(XeasyPKParser.Format) + self.state = 51 + self.match(XeasyPKParser.Simple_name_FO) + self.state = 52 + self.match(XeasyPKParser.RETURN_FO) + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + class InameContext(ParserRuleContext): __slots__ = 'parser' @@ -382,16 +449,16 @@ def exitRule(self, listener:ParseTreeListener): def iname(self): localctx = XeasyPKParser.InameContext(self, self._ctx, self.state) - self.enterRule(localctx, 4, self.RULE_iname) + self.enterRule(localctx, 6, self.RULE_iname) try: self.enterOuterAlt(localctx, 1) - self.state = 47 + self.state = 54 self.match(XeasyPKParser.Iname) - self.state = 48 + self.state = 55 self.match(XeasyPKParser.Integer_IN) - self.state = 49 + self.state = 56 self.match(XeasyPKParser.Simple_name_IN) - self.state = 50 + self.state = 57 self.match(XeasyPKParser.RETURN_IN) except RecognitionException as re: localctx.exception = re @@ -435,14 +502,14 @@ def exitRule(self, listener:ParseTreeListener): def cyana_format(self): localctx = XeasyPKParser.Cyana_formatContext(self, self._ctx, self.state) - self.enterRule(localctx, 6, self.RULE_cyana_format) + self.enterRule(localctx, 8, self.RULE_cyana_format) try: self.enterOuterAlt(localctx, 1) - self.state = 52 + self.state = 59 self.match(XeasyPKParser.Cyana_format) - self.state = 53 + self.state = 60 self.match(XeasyPKParser.Simple_name_CY) - self.state = 54 + self.state = 61 self.match(XeasyPKParser.RETURN_CY) except RecognitionException as re: localctx.exception = re @@ -489,25 +556,25 @@ def exitRule(self, listener:ParseTreeListener): def spectrum(self): localctx = XeasyPKParser.SpectrumContext(self, self._ctx, self.state) - self.enterRule(localctx, 8, self.RULE_spectrum) + self.enterRule(localctx, 10, self.RULE_spectrum) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 56 + self.state = 63 self.match(XeasyPKParser.Spectrum) - self.state = 58 + self.state = 65 self._errHandler.sync(self) _la = self._input.LA(1) while True: - self.state = 57 + self.state = 64 self.match(XeasyPKParser.Simple_name_SP) - self.state = 60 + self.state = 67 self._errHandler.sync(self) _la = self._input.LA(1) - if not (_la==32): + if not (_la==31): break - self.state = 62 + self.state = 69 self.match(XeasyPKParser.RETURN_SP) except RecognitionException as re: localctx.exception = re @@ -554,25 +621,25 @@ def exitRule(self, listener:ParseTreeListener): def tolerance(self): localctx = XeasyPKParser.ToleranceContext(self, self._ctx, self.state) - self.enterRule(localctx, 10, self.RULE_tolerance) + self.enterRule(localctx, 12, self.RULE_tolerance) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 64 + self.state = 71 self.match(XeasyPKParser.Tolerance) - self.state = 66 + self.state = 73 self._errHandler.sync(self) _la = self._input.LA(1) while True: - self.state = 65 + self.state = 72 self.match(XeasyPKParser.Float_TO) - self.state = 68 + self.state = 75 self._errHandler.sync(self) _la = self._input.LA(1) - if not (_la==35): + if not (_la==34): break - self.state = 70 + self.state = 77 self.match(XeasyPKParser.RETURN_TO) except RecognitionException as re: localctx.exception = re @@ -614,20 +681,20 @@ def exitRule(self, listener:ParseTreeListener): def peak_list_2d(self): localctx = XeasyPKParser.Peak_list_2dContext(self, self._ctx, self.state) - self.enterRule(localctx, 12, self.RULE_peak_list_2d) + self.enterRule(localctx, 14, self.RULE_peak_list_2d) try: self.enterOuterAlt(localctx, 1) - self.state = 73 + self.state = 80 self._errHandler.sync(self) _alt = 1 while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: if _alt == 1: - self.state = 72 + self.state = 79 self.peak_2d() else: raise NoViableAltException(self) - self.state = 75 + self.state = 82 self._errHandler.sync(self) _alt = self._interp.adaptivePredict(self._input,4,self._ctx) @@ -696,28 +763,30 @@ def exitRule(self, listener:ParseTreeListener): def peak_2d(self): localctx = XeasyPKParser.Peak_2dContext(self, self._ctx, self.state) - self.enterRule(localctx, 14, self.RULE_peak_2d) + self.enterRule(localctx, 16, self.RULE_peak_2d) try: self.enterOuterAlt(localctx, 1) - self.state = 77 + self.state = 84 self.match(XeasyPKParser.Integer) - self.state = 78 + self.state = 85 self.match(XeasyPKParser.Float) - self.state = 79 + self.state = 86 self.match(XeasyPKParser.Float) - self.state = 80 + self.state = 87 self.match(XeasyPKParser.Integer) - self.state = 81 + self.state = 88 self.match(XeasyPKParser.Simple_name) - self.state = 82 + self.state = 89 self.number() - self.state = 83 + self.state = 90 self.number() - self.state = 84 + self.state = 91 self.match(XeasyPKParser.Simple_name) - self.state = 85 + self.state = 92 + self.match(XeasyPKParser.Integer) + self.state = 93 self.assign() - self.state = 86 + self.state = 94 self.assign() except RecognitionException as re: localctx.exception = re @@ -759,20 +828,20 @@ def exitRule(self, listener:ParseTreeListener): def peak_list_3d(self): localctx = XeasyPKParser.Peak_list_3dContext(self, self._ctx, self.state) - self.enterRule(localctx, 16, self.RULE_peak_list_3d) + self.enterRule(localctx, 18, self.RULE_peak_list_3d) try: self.enterOuterAlt(localctx, 1) - self.state = 89 + self.state = 97 self._errHandler.sync(self) _alt = 1 while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: if _alt == 1: - self.state = 88 + self.state = 96 self.peak_3d() else: raise NoViableAltException(self) - self.state = 91 + self.state = 99 self._errHandler.sync(self) _alt = self._interp.adaptivePredict(self._input,5,self._ctx) @@ -841,32 +910,34 @@ def exitRule(self, listener:ParseTreeListener): def peak_3d(self): localctx = XeasyPKParser.Peak_3dContext(self, self._ctx, self.state) - self.enterRule(localctx, 18, self.RULE_peak_3d) + self.enterRule(localctx, 20, self.RULE_peak_3d) try: self.enterOuterAlt(localctx, 1) - self.state = 93 + self.state = 101 self.match(XeasyPKParser.Integer) - self.state = 94 + self.state = 102 self.match(XeasyPKParser.Float) - self.state = 95 + self.state = 103 self.match(XeasyPKParser.Float) - self.state = 96 + self.state = 104 self.match(XeasyPKParser.Float) - self.state = 97 + self.state = 105 self.match(XeasyPKParser.Integer) - self.state = 98 + self.state = 106 self.match(XeasyPKParser.Simple_name) - self.state = 99 + self.state = 107 self.number() - self.state = 100 + self.state = 108 self.number() - self.state = 101 + self.state = 109 self.match(XeasyPKParser.Simple_name) - self.state = 102 + self.state = 110 + self.match(XeasyPKParser.Integer) + self.state = 111 self.assign() - self.state = 103 + self.state = 112 self.assign() - self.state = 104 + self.state = 113 self.assign() except RecognitionException as re: localctx.exception = re @@ -908,20 +979,20 @@ def exitRule(self, listener:ParseTreeListener): def peak_list_4d(self): localctx = XeasyPKParser.Peak_list_4dContext(self, self._ctx, self.state) - self.enterRule(localctx, 20, self.RULE_peak_list_4d) + self.enterRule(localctx, 22, self.RULE_peak_list_4d) try: self.enterOuterAlt(localctx, 1) - self.state = 107 + self.state = 116 self._errHandler.sync(self) _alt = 1 while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: if _alt == 1: - self.state = 106 + self.state = 115 self.peak_4d() else: raise NoViableAltException(self) - self.state = 109 + self.state = 118 self._errHandler.sync(self) _alt = self._interp.adaptivePredict(self._input,6,self._ctx) @@ -990,36 +1061,38 @@ def exitRule(self, listener:ParseTreeListener): def peak_4d(self): localctx = XeasyPKParser.Peak_4dContext(self, self._ctx, self.state) - self.enterRule(localctx, 22, self.RULE_peak_4d) + self.enterRule(localctx, 24, self.RULE_peak_4d) try: self.enterOuterAlt(localctx, 1) - self.state = 111 + self.state = 120 self.match(XeasyPKParser.Integer) - self.state = 112 + self.state = 121 self.match(XeasyPKParser.Float) - self.state = 113 + self.state = 122 self.match(XeasyPKParser.Float) - self.state = 114 + self.state = 123 self.match(XeasyPKParser.Float) - self.state = 115 + self.state = 124 self.match(XeasyPKParser.Float) - self.state = 116 + self.state = 125 self.match(XeasyPKParser.Integer) - self.state = 117 + self.state = 126 self.match(XeasyPKParser.Simple_name) - self.state = 118 + self.state = 127 self.number() - self.state = 119 + self.state = 128 self.number() - self.state = 120 + self.state = 129 self.match(XeasyPKParser.Simple_name) - self.state = 121 + self.state = 130 + self.match(XeasyPKParser.Integer) + self.state = 131 self.assign() - self.state = 122 + self.state = 132 self.assign() - self.state = 123 + self.state = 133 self.assign() - self.state = 124 + self.state = 134 self.assign() except RecognitionException as re: localctx.exception = re @@ -1066,13 +1139,13 @@ def exitRule(self, listener:ParseTreeListener): def number(self): localctx = XeasyPKParser.NumberContext(self, self._ctx, self.state) - self.enterRule(localctx, 24, self.RULE_number) + self.enterRule(localctx, 26, self.RULE_number) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 126 + self.state = 136 _la = self._input.LA(1) - if not((((_la) & ~0x3f) == 0 and ((1 << _la) & 9088) != 0)): + if not((((_la) & ~0x3f) == 0 and ((1 << _la) & 4992) != 0)): self._errHandler.recoverInline(self) else: self._errHandler.reportMatch(self) @@ -1116,25 +1189,25 @@ def exitRule(self, listener:ParseTreeListener): def assign(self): localctx = XeasyPKParser.AssignContext(self, self._ctx, self.state) - self.enterRule(localctx, 26, self.RULE_assign) + self.enterRule(localctx, 28, self.RULE_assign) try: - self.state = 133 + self.state = 143 self._errHandler.sync(self) token = self._input.LA(1) if token in [7]: self.enterOuterAlt(localctx, 1) - self.state = 128 + self.state = 138 self.match(XeasyPKParser.Integer) pass - elif token in [13]: + elif token in [12]: self.enterOuterAlt(localctx, 2) - self.state = 129 + self.state = 139 self.match(XeasyPKParser.Simple_name) - self.state = 131 + self.state = 141 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,7,self._ctx) if la_ == 1: - self.state = 130 + self.state = 140 self.match(XeasyPKParser.Integer) diff --git a/wwpdb/utils/nmr/pk/XeasyPKParserListener.py b/wwpdb/utils/nmr/pk/XeasyPKParserListener.py index 82fd0c05..6f644cc7 100644 --- a/wwpdb/utils/nmr/pk/XeasyPKParserListener.py +++ b/wwpdb/utils/nmr/pk/XeasyPKParserListener.py @@ -1,138 +1,1156 @@ -# Generated from XeasyPKParser.g4 by ANTLR 4.13.0 -from antlr4 import * -if "." in __name__: - from .XeasyPKParser import XeasyPKParser -else: - from XeasyPKParser import XeasyPKParser +## +# File: XeasyPKParserListener.py +# Date: 04-Dec-2024 +# +# Updates: +""" ParserLister class for XEASY PK files. + @author: Masashi Yokochi +""" +import sys +import re +import copy +import collections +import numpy as np + +from antlr4 import ParseTreeListener + +try: + from wwpdb.utils.nmr.pk.XeasyPKParser import XeasyPKParser + from wwpdb.utils.nmr.pk.BasePKParserListener import BasePKParserListener + from wwpdb.utils.nmr.mr.ParserListenerUtil import (ISOTOPE_NUMBERS_OF_NMR_OBS_NUCS, + REPRESENTATIVE_MODEL_ID, + REPRESENTATIVE_ALT_ID, + SPECTRAL_DIM_TEMPLATE, + isCyclicPolymer, + extractPeakAssignment, + getPkRow) + from wwpdb.utils.nmr.AlignUtil import (emptyValue, + sortPolySeqRst, + syncCompIdOfPolySeqRst, + alignPolymerSequence, + assignPolymerSequence, + trimSequenceAlignment, + splitPolySeqRstForMultimers, + splitPolySeqRstForExactNoes, + splitPolySeqRstForNonPoly, + splitPolySeqRstForBranched) + +except ImportError: + from nmr.pk.XeasyPKParser import XeasyPKParser + from nmr.pk.BasePKParserListener import BasePKParserListener + from nmr.mr.ParserListenerUtil import (ISOTOPE_NUMBERS_OF_NMR_OBS_NUCS, + REPRESENTATIVE_MODEL_ID, + REPRESENTATIVE_ALT_ID, + SPECTRAL_DIM_TEMPLATE, + isCyclicPolymer, + extractPeakAssignment, + getPkRow) + from nmr.AlignUtil import (emptyValue, + sortPolySeqRst, + syncCompIdOfPolySeqRst, + alignPolymerSequence, + assignPolymerSequence, + trimSequenceAlignment, + splitPolySeqRstForMultimers, + splitPolySeqRstForExactNoes, + splitPolySeqRstForNonPoly, + splitPolySeqRstForBranched) + # This class defines a complete listener for a parse tree produced by XeasyPKParser. -class XeasyPKParserListener(ParseTreeListener): +class XeasyPKParserListener(ParseTreeListener, BasePKParserListener): + + __labels = None + + def __init__(self, verbose=True, log=sys.stdout, + representativeModelId=REPRESENTATIVE_MODEL_ID, + representativeAltId=REPRESENTATIVE_ALT_ID, + mrAtomNameMapping=None, + cR=None, caC=None, ccU=None, csStat=None, nefT=None, + reasons=None): + super().__init__(verbose, log, representativeModelId, representativeAltId, + mrAtomNameMapping, cR, caC, ccU, csStat, nefT, reasons) + + self.file_type = 'nm-pea-xea' + self.software_name = 'XEASY' # Enter a parse tree produced by XeasyPKParser#xeasy_pk. - def enterXeasy_pk(self, ctx:XeasyPKParser.Xeasy_pkContext): - pass + def enterXeasy_pk(self, ctx: XeasyPKParser.Xeasy_pkContext): # pylint: disable=unused-argument + self.num_of_dim = -1 + self.acq_dim_id = 1 + self.spectral_dim = {} + self.listIdInternal = {} + self.chainNumberDict = {} + self.extResKey = [] + self.polySeqRst = [] + self.polySeqRstFailed = [] + self.polySeqRstFailedAmbig = [] + self.compIdMap = {} + self.f = [] # Exit a parse tree produced by XeasyPKParser#xeasy_pk. - def exitXeasy_pk(self, ctx:XeasyPKParser.Xeasy_pkContext): - pass + def exitXeasy_pk(self, ctx: XeasyPKParser.Xeasy_pkContext): # pylint: disable=unused-argument + + try: + + if self.hasPolySeq and self.polySeqRst is not None: + sortPolySeqRst(self.polySeqRst, + None if self.reasons is None else self.reasons.get('non_poly_remap')) + + self.seqAlign, _ = alignPolymerSequence(self.pA, self.polySeq, self.polySeqRst, + resolvedMultimer=self.reasons is not None) + self.chainAssign, message = assignPolymerSequence(self.pA, self.ccU, self.file_type, self.polySeq, self.polySeqRst, self.seqAlign) + + if len(message) > 0: + self.f.extend(message) + + if self.chainAssign is not None: + + if len(self.polySeq) == len(self.polySeqRst): + + chain_mapping = {} + + for ca in self.chainAssign: + ref_chain_id = ca['ref_chain_id'] + test_chain_id = ca['test_chain_id'] + + if ref_chain_id != test_chain_id: + chain_mapping[test_chain_id] = ref_chain_id + + if len(chain_mapping) == len(self.polySeq): + + for ps in self.polySeqRst: + if ps['chain_id'] in chain_mapping: + ps['chain_id'] = chain_mapping[ps['chain_id']] + + self.seqAlign, _ = alignPolymerSequence(self.pA, self.polySeq, self.polySeqRst, + resolvedMultimer=self.reasons is not None) + self.chainAssign, _ = assignPolymerSequence(self.pA, self.ccU, self.file_type, self.polySeq, self.polySeqRst, self.seqAlign) + + trimSequenceAlignment(self.seqAlign, self.chainAssign) + + if self.reasons is None and any(f for f in self.f + if '[Atom not found]' in f or '[Sequence mismatch]' in f): + + seqIdRemap = [] + + cyclicPolymer = {} + + for ca in self.chainAssign: + ref_chain_id = ca['ref_chain_id'] + test_chain_id = ca['test_chain_id'] + + sa = next(sa for sa in self.seqAlign + if sa['ref_chain_id'] == ref_chain_id + and sa['test_chain_id'] == test_chain_id) + + poly_seq_model = next(ps for ps in self.polySeq + if ps['auth_chain_id'] == ref_chain_id) + poly_seq_rst = next(ps for ps in self.polySeqRst + if ps['chain_id'] == test_chain_id) + + seq_id_mapping = {} + offset = None + for ref_seq_id, mid_code, test_seq_id in zip(sa['ref_seq_id'], sa['mid_code'], sa['test_seq_id']): + if test_seq_id is None: + continue + if mid_code == '|': + try: + seq_id_mapping[test_seq_id] = next(auth_seq_id for auth_seq_id, seq_id + in zip(poly_seq_model['auth_seq_id'], poly_seq_model['seq_id']) + if seq_id == ref_seq_id and isinstance(auth_seq_id, int)) + if offset is None: + offset = seq_id_mapping[test_seq_id] - test_seq_id + except StopIteration: + pass + elif mid_code == ' ' and test_seq_id in poly_seq_rst['seq_id']: + idx = poly_seq_rst['seq_id'].index(test_seq_id) + if poly_seq_rst['comp_id'][idx] == '.' and poly_seq_rst['auth_comp_id'][idx] not in emptyValue: + seq_id_mapping[test_seq_id] = next(auth_seq_id for auth_seq_id, seq_id + in zip(poly_seq_model['auth_seq_id'], poly_seq_model['seq_id']) + if seq_id == ref_seq_id and isinstance(auth_seq_id, int)) + + if offset is not None and all(v - k == offset for k, v in seq_id_mapping.items()): + test_seq_id_list = list(seq_id_mapping.keys()) + min_test_seq_id = min(test_seq_id_list) + max_test_seq_id = max(test_seq_id_list) + for test_seq_id in range(min_test_seq_id + 1, max_test_seq_id): + if test_seq_id not in seq_id_mapping: + seq_id_mapping[test_seq_id] = test_seq_id + offset + + if ref_chain_id not in cyclicPolymer: + cyclicPolymer[ref_chain_id] =\ + isCyclicPolymer(self.cR, self.polySeq, ref_chain_id, + self.representativeModelId, self.representativeAltId, self.modelNumName) + + if cyclicPolymer[ref_chain_id]: + + poly_seq_model = next(ps for ps in self.polySeq + if ps['auth_chain_id'] == ref_chain_id) + + offset = None + for seq_id, comp_id in zip(poly_seq_rst['seq_id'], poly_seq_rst['comp_id']): + if seq_id is not None and seq_id not in seq_id_mapping: + _seq_id = next((_seq_id for _seq_id, _comp_id in zip(poly_seq_model['seq_id'], poly_seq_model['comp_id']) + if _seq_id not in seq_id_mapping.values() and _comp_id == comp_id), None) + if _seq_id is not None: + offset = seq_id - _seq_id + break + + if offset is not None: + for seq_id in poly_seq_rst['seq_id']: + if seq_id is not None and seq_id not in seq_id_mapping: + seq_id_mapping[seq_id] = seq_id - offset + + if any(k for k, v in seq_id_mapping.items() if k != v)\ + and not any(k for k, v in seq_id_mapping.items() + if v in poly_seq_model['seq_id'] + and k == poly_seq_model['auth_seq_id'][poly_seq_model['seq_id'].index(v)]): + seqIdRemap.append({'chain_id': test_chain_id, 'seq_id_dict': seq_id_mapping}) + + if len(seqIdRemap) > 0: + if 'seq_id_remap' not in self.reasonsForReParsing: + self.reasonsForReParsing['seq_id_remap'] = seqIdRemap + + if any(ps for ps in self.polySeq if 'identical_chain_id' in ps): + polySeqRst, chainIdMapping = splitPolySeqRstForMultimers(self.pA, self.polySeq, self.polySeqRst, self.chainAssign) + + if polySeqRst is not None and (not self.hasNonPoly or len(self.polySeq) // len(self.nonPoly) in (1, 2)): + self.polySeqRst = polySeqRst + if 'chain_id_remap' not in self.reasonsForReParsing: + self.reasonsForReParsing['chain_id_remap'] = chainIdMapping + + if len(self.polySeq) == 1 and len(self.polySeqRst) == 1: + polySeqRst, chainIdMapping, _ =\ + splitPolySeqRstForExactNoes(self.pA, self.polySeq, self.polySeqRst, self.chainAssign) + + if polySeqRst is not None: + self.polySeqRst = polySeqRst + if 'chain_id_clone' not in self.reasonsForReParsing: + self.reasonsForReParsing['chain_id_clone'] = chainIdMapping + + if self.hasNonPoly: + polySeqRst, nonPolyMapping = splitPolySeqRstForNonPoly(self.ccU, self.nonPoly, self.polySeqRst, + self.seqAlign, self.chainAssign) + + if polySeqRst is not None: + self.polySeqRst = polySeqRst + if 'non_poly_remap' not in self.reasonsForReParsing: + self.reasonsForReParsing['non_poly_remap'] = nonPolyMapping + + if self.hasBranched: + polySeqRst, branchedMapping = splitPolySeqRstForBranched(self.pA, self.polySeq, self.branched, self.polySeqRst, + self.chainAssign) + + if polySeqRst is not None: + self.polySeqRst = polySeqRst + if 'branched_remap' not in self.reasonsForReParsing: + self.reasonsForReParsing['branched_remap'] = branchedMapping + + if len(self.polySeqRstFailed) > 0: + sortPolySeqRst(self.polySeqRstFailed) + if not any(f for f in self.f if '[Sequence mismatch]' in f): # 2n6y + syncCompIdOfPolySeqRst(self.polySeqRstFailed, self.compIdMap) # 2mx9 + + seqAlignFailed, _ = alignPolymerSequence(self.pA, self.polySeq, self.polySeqRstFailed) + chainAssignFailed, _ = assignPolymerSequence(self.pA, self.ccU, self.file_type, + self.polySeq, self.polySeqRstFailed, seqAlignFailed) + + if chainAssignFailed is not None: + seqIdRemapFailed = [] + + uniq_ps = not any('identical_chain_id' in ps for ps in self.polySeq) + for ca in chainAssignFailed: + if ca['conflict'] > 0: + continue + ref_chain_id = ca['ref_chain_id'] + test_chain_id = ca['test_chain_id'] + + sa = next((sa for sa in seqAlignFailed + if sa['ref_chain_id'] == ref_chain_id + and sa['test_chain_id'] == test_chain_id), None) + + if sa is None: + continue + + poly_seq_model = next(ps for ps in self.polySeq + if ps['auth_chain_id'] == ref_chain_id) + + seq_id_mapping = {} + for ref_seq_id, mid_code, test_seq_id in zip(sa['ref_seq_id'], sa['mid_code'], sa['test_seq_id']): + if test_seq_id is None: + continue + if mid_code == '|': + try: + seq_id_mapping[test_seq_id] = next(auth_seq_id for auth_seq_id, seq_id + in zip(poly_seq_model['auth_seq_id'], poly_seq_model['seq_id']) + if seq_id == ref_seq_id and isinstance(auth_seq_id, int)) + except StopIteration: + if uniq_ps: + seq_id_mapping[test_seq_id] = ref_seq_id + + offset = None + offsets = [v - k for k, v in seq_id_mapping.items()] + if len(offsets) > 0 and ('gap_in_auth_seq' not in poly_seq_model or not poly_seq_model['gap_in_auth_seq']): + offsets = collections.Counter(offsets).most_common() + if len(offsets) > 1: + offset = offsets[0][0] + for k, v in seq_id_mapping.items(): + if v - k != offset: + seq_id_mapping[k] = k + offset + + if uniq_ps and offset is not None and len(seq_id_mapping) > 0\ + and ('gap_in_auth_seq' not in poly_seq_model or not poly_seq_model['gap_in_auth_seq']): + for ref_seq_id, mid_code, test_seq_id, ref_code, test_code in zip(sa['ref_seq_id'], sa['mid_code'], sa['test_seq_id'], + sa['ref_code'], sa['test_code']): + if test_seq_id is None: + continue + if mid_code == '|' and test_seq_id not in seq_id_mapping: + seq_id_mapping[test_seq_id] = test_seq_id + offset + elif ref_code != '.' and test_code == '.': + seq_id_mapping[test_seq_id] = test_seq_id + offset + + if any(k for k, v in seq_id_mapping.items() if k != v)\ + and not any(k for k, v in seq_id_mapping.items() + if v in poly_seq_model['seq_id'] + and k == poly_seq_model['auth_seq_id'][poly_seq_model['seq_id'].index(v)]): + seqIdRemapFailed.append({'chain_id': ref_chain_id, 'seq_id_dict': seq_id_mapping, + 'comp_id_set': list(set(poly_seq_model['comp_id']))}) + + if len(seqIdRemapFailed) > 0: + if 'chain_seq_id_remap' not in self.reasonsForReParsing: + seqIdRemap = self.reasonsForReParsing['seq_id_remap'] if 'seq_id_remap' in self.reasonsForReParsing else [] + if len(seqIdRemap) != len(seqIdRemapFailed)\ + or seqIdRemap[0]['chain_id'] != seqIdRemapFailed[0]['chain_id']\ + or not all(src_seq_id in seqIdRemap[0] for src_seq_id in seqIdRemapFailed[0]): + self.reasonsForReParsing['chain_seq_id_remap'] = seqIdRemapFailed + + else: + for ps in self.polySeqRstFailed: + for ca in self.chainAssign: + ref_chain_id = ca['ref_chain_id'] + test_chain_id = ca['test_chain_id'] + + if test_chain_id != ps['chain_id']: + continue + + sa = next(sa for sa in self.seqAlign + if sa['ref_chain_id'] == ref_chain_id + and sa['test_chain_id'] == test_chain_id) + + if len(sa['test_seq_id']) != len(sa['ref_seq_id']): + continue + + poly_seq_model = next(ps for ps in self.polySeq + if ps['auth_chain_id'] == ref_chain_id) + + seq_id_mapping, comp_id_mapping = {}, {} + + for seq_id, comp_id in zip(ps['seq_id'], ps['comp_id']): + if seq_id in sa['test_seq_id']: + idx = sa['test_seq_id'].index(seq_id) + auth_seq_id = sa['ref_seq_id'][idx] + seq_id_mapping[seq_id] = auth_seq_id + comp_id_mapping[seq_id] = comp_id + if any(k for k, v in seq_id_mapping.items() if k != v)\ + or ('label_seq_scheme' not in self.reasonsForReParsing + and all(v not in poly_seq_model['auth_seq_id'] for v in seq_id_mapping.values())): + seqIdRemapFailed.append({'chain_id': ref_chain_id, 'seq_id_dict': seq_id_mapping, + 'comp_id_dict': comp_id_mapping}) + + if len(seqIdRemapFailed) > 0: + if 'ext_chain_seq_id_remap' not in self.reasonsForReParsing: + seqIdRemap = self.reasonsForReParsing['seq_id_remap'] if 'seq_id_remap' in self.reasonsForReParsing else [] + if len(seqIdRemap) != len(seqIdRemapFailed)\ + or seqIdRemap[0]['chain_id'] != seqIdRemapFailed[0]['chain_id']\ + or not all(src_seq_id in seqIdRemap[0] for src_seq_id in seqIdRemapFailed[0]): + self.reasonsForReParsing['ext_chain_seq_id_remap'] = seqIdRemapFailed + + if 'local_seq_scheme' in self.reasonsForReParsing: + if 'non_poly_remap' in self.reasonsForReParsing or 'branched_remap' in self.reasonsForReParsing: + del self.reasonsForReParsing['local_seq_scheme'] + elif 'seq_id_remap' in self.reasonsForReParsing: + del self.reasonsForReParsing['local_seq_scheme'] + elif 'chain_seq_id_remap' in self.reasonsForReParsing: + del self.reasonsForReParsing['local_seq_scheme'] + elif 'ext_chain_seq_id_remap' in self.reasonsForReParsing: + del self.reasonsForReParsing['local_seq_scheme'] + + if 'local_seq_scheme' in self.reasonsForReParsing and len(self.reasonsForReParsing) == 1: + sortPolySeqRst(self.polySeqRstFailed) + if len(self.polySeqRstFailed) > 0: + self.reasonsForReParsing['extend_seq_scheme'] = self.polySeqRstFailed + del self.reasonsForReParsing['local_seq_scheme'] + + if len(self.spectral_dim) > 0: + for d, v in self.spectral_dim.items(): + for _id, _v in v.items(): + self.acq_dim_id = 1 + for __d, __v in _v.items(): + if 'freq_hint' in __v: + center = np.mean(np.array(__v['freq_hint'])) + if __v['atom_isotope_number'] is None: + if 125 < center < 130: + __v['atom_type'] = 'C' + __v['atom_isotope_number'] = 13 + __v['axis_code'] = 'C_aro' + elif 115 < center < 125: + __v['atom_type'] = 'N' + __v['atom_isotope_number'] = 15 + __v['axis_code'] = 'N_ami' + elif 170 < center < 180: + __v['atom_type'] = 'C' + __v['atom_isotope_number'] = 13 + __v['axis_code'] = 'CO' + elif 6 < center < 9: + __v['atom_type'] = 'H' + __v['atom_isotope_number'] = 1 + __v['axis_code'] = 'H_ami_or_aro' + elif 4 < center < 6: + __v['atom_type'] = 'H' + __v['atom_isotope_number'] = 1 + __v['axis_code'] = 'H' + elif 60 < center < 90: + __v['atom_type'] = 'C' + __v['atom_isotope_number'] = 13 + __v['axis_code'] = 'C' + elif 30 < center < 50: + __v['atom_type'] = 'C' + __v['atom_isotope_number'] = 13 + __v['axis_code'] = 'C_ali' + + isotope_number = __v['atom_isotope_number'] + + if isotope_number is not None: + __v['acquisition'] = 'yes' if __d == self.acq_dim_id\ + and (isotope_number == 1 or (isotope_number == 13 and self.exptlMethod == 'SOLID-STATE NMR')) else 'no' + + if __d == 1 and __v['acquisition'] == 'no': + self.acq_dim_id = self.num_of_dim + + __v['under_sampling_type'] = 'not observed' if __v['acquisition'] == 'yes' else 'aliased' + + if __v['spectral_region'] is None: + atom_type = __v['atom_type'] + if 125 < center < 130 and atom_type == 'C': + __v['spectral_region'] = 'C_aro' + elif 115 < center < 125 and atom_type == 'N': + __v['spectral_region'] = 'N_ami' + elif 170 < center < 180 and atom_type == 'C': + __v['spectral_region'] = 'CO' + elif 6 < center < 9 and atom_type == 'H': + __v['spectral_region'] = 'H_ami_or_aro' + elif 4 < center < 6 and atom_type == 'H': + __v['spectral_region'] = 'H_all' + elif 60 < center < 90 and atom_type == 'C': + __v['spectral_region'] = 'C_all' + elif 30 < center < 50 and atom_type == 'C': + __v['spectral_region'] = 'C_ali' + + if len(__v['freq_hint']) > 0 and d > 2 and __d >= 2\ + and self.exptlMethod != 'SOLID-STATE NMR' and __v['atom_isotope_number'] == 13: + max_ppm = max(__v['freq_hint']) + min_ppm = min(__v['freq_hint']) + width = max_ppm - min_ppm + if center < 100.0 and width < 50.0: + __v['under_sampling_type'] = 'fold' + + del __v['freq_hint'] + + for __v in _v.values(): + if __v['axis_code'] == 'H_ami_or_aro': + has_a = any(___v['spectral_region'] == 'C_aro' for ___v in _v.values()) + __v['axis_code'] = 'H_aro' if has_a else 'H_ami' + if __v['spectral_region'] == 'H_ami_or_aro': + has_a = any(___v['spectral_region'] == 'C_aro' for ___v in _v.values()) + __v['spectral_region'] = 'H_aro' if has_a else 'H_ami' + + if self.debug: + print(f'num_of_dim: {d}, list_id: {_id}') + for __d, __v in _v.items(): + print(f'{__d} {__v}') + + finally: + self.warningMessage = sorted(list(set(self.f)), key=self.f.index) # Enter a parse tree produced by XeasyPKParser#dimension. - def enterDimension(self, ctx:XeasyPKParser.DimensionContext): - pass + def enterDimension(self, ctx: XeasyPKParser.DimensionContext): + if ctx.Integer_ND(): + self.num_of_dim = int(str(ctx.Integer_ND())) + self.acq_dim_id = 1 + self.__labels = {} # Exit a parse tree produced by XeasyPKParser#dimension. - def exitDimension(self, ctx:XeasyPKParser.DimensionContext): + def exitDimension(self, ctx: XeasyPKParser.DimensionContext): # pylint: disable=unused-argument pass + # Enter a parse tree produced by XeasyPKParser#format. + def enterFormat(self, ctx: XeasyPKParser.FormatContext): + if ctx.Simple_name_FO(): + if self.num_of_dim == -1: + val = str(ctx.Simple_name_FO()) + if '2D' in val: + self.num_of_dim = 2 + if '3D' in val: + self.num_of_dim = 3 + if '4D' in val: + self.num_of_dim = 4 - # Enter a parse tree produced by XeasyPKParser#iname. - def enterIname(self, ctx:XeasyPKParser.InameContext): + # Exit a parse tree produced by XeasyPKParser#format. + def exitFormat(self, ctx: XeasyPKParser.FormatContext): # pylint: disable=unused-argument pass + # Enter a parse tree produced by XeasyPKParser#iname. + def enterIname(self, ctx: XeasyPKParser.InameContext): + if ctx.Integer_IN(): + _dim_id = int(str(ctx.Integer_IN())) + self.num_of_dim = max(self.num_of_dim, _dim_id) + if ctx.Simple_name_IN(): + _axis_code = str(ctx.Simple_name_IN()) + if _axis_code not in emptyValue: + self.__labels[_dim_id] = _axis_code + # Exit a parse tree produced by XeasyPKParser#iname. - def exitIname(self, ctx:XeasyPKParser.InameContext): + def exitIname(self, ctx: XeasyPKParser.InameContext): # pylint: disable=unused-argument pass - # Enter a parse tree produced by XeasyPKParser#cyana_format. - def enterCyana_format(self, ctx:XeasyPKParser.Cyana_formatContext): - pass + def enterCyana_format(self, ctx: XeasyPKParser.Cyana_formatContext): + if ctx.Simple_name_CY(): + _axis_codes = str(ctx.Simple_name_CY()) + if self.num_of_dim == -1: + self.num_of_dim = max(self.num_of_dim, len(_axis_codes)) + + for _dim_id, _axis_code in enumerate(_axis_codes, start=1): + if _dim_id not in self.__labels: + if _axis_code not in emptyValue: + self.__labels[_dim_id] = _axis_code # Exit a parse tree produced by XeasyPKParser#cyana_format. - def exitCyana_format(self, ctx:XeasyPKParser.Cyana_formatContext): + def exitCyana_format(self, ctx: XeasyPKParser.Cyana_formatContext): # pylint: disable=unused-argument pass - # Enter a parse tree produced by XeasyPKParser#spectrum. - def enterSpectrum(self, ctx:XeasyPKParser.SpectrumContext): - pass + def enterSpectrum(self, ctx: XeasyPKParser.SpectrumContext): + _dim_id = 0 + if ctx.Simple_name_SP(_dim_id): + _dim_id += 1 + while ctx.Simple_name_SP(_dim_id): + self.num_of_dim = max(self.num_of_dim, _dim_id) + if _dim_id not in self.__labels: + _axis_code = str(ctx.Simple_name_SP(_dim_id)) + if _axis_code not in emptyValue: + self.__labels[_dim_id] = _axis_code + _dim_id += 1 # Exit a parse tree produced by XeasyPKParser#spectrum. - def exitSpectrum(self, ctx:XeasyPKParser.SpectrumContext): + def exitSpectrum(self, ctx: XeasyPKParser.SpectrumContext): # pylint: disable=unused-argument pass - # Enter a parse tree produced by XeasyPKParser#tolerance. - def enterTolerance(self, ctx:XeasyPKParser.ToleranceContext): + def enterTolerance(self, ctx: XeasyPKParser.ToleranceContext): # pylint: disable=unused-argument pass # Exit a parse tree produced by XeasyPKParser#tolerance. - def exitTolerance(self, ctx:XeasyPKParser.ToleranceContext): + def exitTolerance(self, ctx: XeasyPKParser.ToleranceContext): # pylint: disable=unused-argument pass - # Enter a parse tree produced by XeasyPKParser#peak_list_2d. - def enterPeak_list_2d(self, ctx:XeasyPKParser.Peak_list_2dContext): - pass + def enterPeak_list_2d(self, ctx: XeasyPKParser.Peak_list_2dContext): # pylint: disable=unused-argument + self.fillCurrentSpectralDim() + + self.num_of_dim = 2 + self.cur_subtype = 'peak2d' + if self.num_of_dim not in self.listIdInternal: + self.listIdInternal[self.num_of_dim] = 0 + self.listIdInternal[self.num_of_dim] += 1 + self.cur_list_id = self.listIdInternal[self.num_of_dim] + if self.num_of_dim not in self.spectral_dim: + self.spectral_dim[self.num_of_dim] = {} + if self.cur_list_id not in self.spectral_dim[self.num_of_dim]: + self.spectral_dim[self.num_of_dim][self.cur_list_id] = {} + for _dim_id in range(1, self.num_of_dim + 1): + self.spectral_dim[self.num_of_dim][self.cur_list_id][_dim_id] =\ + copy.copy(SPECTRAL_DIM_TEMPLATE + if len(self.cur_spectral_dim) == 0 + or _dim_id not in self.cur_spectral_dim + else self.cur_spectral_dim[_dim_id]) + self.spectral_dim[self.num_of_dim][self.cur_list_id][_dim_id]['freq_hint'] = [] + self.peaks2D = 0 + self.cur_spectral_dim = {} # Exit a parse tree produced by XeasyPKParser#peak_list_2d. - def exitPeak_list_2d(self, ctx:XeasyPKParser.Peak_list_2dContext): + def exitPeak_list_2d(self, ctx: XeasyPKParser.Peak_list_2dContext): # pylint: disable=unused-argument pass - # Enter a parse tree produced by XeasyPKParser#peak_2d. - def enterPeak_2d(self, ctx:XeasyPKParser.Peak_2dContext): - pass + def enterPeak_2d(self, ctx: XeasyPKParser.Peak_2dContext): # pylint: disable=unused-argument + self.peaks2D += 1 + + self.atomSelectionSet.clear() # Exit a parse tree produced by XeasyPKParser#peak_2d. - def exitPeak_2d(self, ctx:XeasyPKParser.Peak_2dContext): - pass + def exitPeak_2d(self, ctx: XeasyPKParser.Peak_2dContext): + + try: + + if len(self.numberSelection) == 0 or len(self.assignmentSelection) == 0: + self.peaks2D -= 1 + return + + index = int(str(ctx.Integer(0))) + x_ppm = float(str(ctx.Float(0))) + y_ppm = float(str(ctx.Float(1))) + # color_code = int(str(ctx.Integer(1))) + # spectrum_type = str(ctx.Simple_name(0)) + vol = self.originalNumberSelection[0] + vol_err = self.originalNumberSelection[1] + # integral_method = str(ctx.Simple_name(1)) + type = int(str(ctx.Integer(2))) + x_ass = self.assignmentSelection[0] + y_ass = self.assignmentSelection[1] + + if not self.hasPolySeq and not self.hasNonPolySeq: + return + + if x_ppm is None or y_ppm is None or type != 0: + self.peaks2D -= 1 + return + + dstFunc = self.validatePeak2D(index, x_ppm, y_ppm, None, None, None, None, + None, None, None, None, None, None, vol, vol_err) + + if dstFunc is None: + self.peaks2D -= 1 + return + + cur_spectral_dim = self.spectral_dim[self.num_of_dim][self.cur_list_id] + + cur_spectral_dim[1]['freq_hint'].append(x_ppm) + cur_spectral_dim[2]['freq_hint'].append(y_ppm) + + has_assignments = False + + if x_ass is not None and y_ass is not None: + assignments = [{}] * self.num_of_dim + try: + assignments[0] = extractPeakAssignment(1, x_ass, self.authAsymIdSet, self.compIdSet, self.altCompIdSet, + self.polyPeptide, self.polyDeoxyribonucleotide, self.polyRibonucleotide, self.nefT)[0] + assignments[1] = extractPeakAssignment(1, y_ass, self.authAsymIdSet, self.compIdSet, self.altCompIdSet, + self.polyPeptide, self.polyDeoxyribonucleotide, self.polyRibonucleotide, self.nefT)[0] + except Exception: + pass + + if all(len(a) > 0 for a in assignments): + + self.retrieveLocalSeqScheme() + + hasChainId = all(a['chain_id'] is not None for a in assignments) + hasCompId = all(a['comp_id'] is not None for a in assignments) + + a1 = assignments[0] + a2 = assignments[1] + + if hasChainId and hasCompId: + chainAssign1, asis1 = self.assignCoordPolymerSequenceWithChainId(a1['chain_id'], a1['seq_id'], a1['comp_id'], a1['atom_id'], index) + chainAssign2, asis2 = self.assignCoordPolymerSequenceWithChainId(a2['chain_id'], a2['seq_id'], a2['comp_id'], a2['atom_id'], index) + + elif hasChainId: + chainAssign1 = self.assignCoordPolymerSequenceWithChainIdWithoutCompId(a1['chain_id'], a1['seq_id'], a1['atom_id'], index) + chainAssign2 = self.assignCoordPolymerSequenceWithChainIdWithoutCompId(a2['chain_id'], a2['seq_id'], a2['atom_id'], index) + asis1 = asis2 = False + + elif hasCompId: + chainAssign1, asis1 = self.assignCoordPolymerSequence(a1['chain_id'], a1['seq_id'], a1['comp_id'], a1['atom_id'], index) + chainAssign2, asis2 = self.assignCoordPolymerSequence(a2['chain_id'], a2['seq_id'], a2['comp_id'], a2['atom_id'], index) + + else: + chainAssign1 = self.assignCoordPolymerSequenceWithoutCompId(a1['seq_id'], a1['atom_id'], index) + chainAssign2 = self.assignCoordPolymerSequenceWithoutCompId(a2['seq_id'], a2['atom_id'], index) + asis1 = asis2 = False + + if len(chainAssign1) > 0 and len(chainAssign2) > 0: + self.selectCoordAtoms(chainAssign1, a1['seq_id'], a1['comp_id'], a1['atom_id'], index) + self.selectCoordAtoms(chainAssign2, a2['seq_id'], a2['comp_id'], a2['atom_id'], index) + + if len(self.atomSelectionSet) == self.num_of_dim: + has_assignments = True + + if self.createSfDict__: + sf = self.getSf() + + if self.debug: + print(f"subtype={self.cur_subtype} id={self.peaks2D} (index={index}) " + f"{x_ass}, {y_ass} -> {self.atomSelectionSet[0] if has_assignments else None} {self.atomSelectionSet[1] if has_assignments else None} {dstFunc}") + + if self.createSfDict__ and sf is not None: + sf['index_id'] += 1 + ambig_code1 = ambig_code2 = None + if has_assignments: + atom1 = self.atomSelectionSet[0][0] + atom2 = self.atomSelectionSet[1][0] + if len(self.atomSelectionSet[0]) > 1: + ambig_code1 = self.csStat.getMaxAmbigCodeWoSetId(atom1['comp_id'], atom1['atom_id']) + if ambig_code1 == 0: + ambig_code1 = None + if len(self.atomSelectionSet[1]) > 1: + ambig_code2 = self.csStat.getMaxAmbigCodeWoSetId(atom2['comp_id'], atom2['atom_id']) + if ambig_code2 == 0: + ambig_code2 = None + else: + atom1 = atom2 = None + + row = getPkRow(self.cur_subtype, sf['id'], sf['index_id'], + sf['list_id'], self.entryId, dstFunc, + self.authToStarSeq, self.authToOrigSeq, self.offsetHolder, + atom1, atom2, asis1=asis1, asis2=asis2, + ambig_code1=ambig_code1, ambig_code2=ambig_code2) + sf['loop'].add_data(row) + + finally: + self.numberSelection.clear() + self.originalNumberSelection.clear() + self.assignmentSelection.clear() # Enter a parse tree produced by XeasyPKParser#peak_list_3d. - def enterPeak_list_3d(self, ctx:XeasyPKParser.Peak_list_3dContext): - pass + def enterPeak_list_3d(self, ctx: XeasyPKParser.Peak_list_3dContext): # pylint: disable=unused-argument + self.fillCurrentSpectralDim() + + self.num_of_dim = 3 + self.cur_subtype = 'peak3d' + if self.num_of_dim not in self.listIdInternal: + self.listIdInternal[self.num_of_dim] = 0 + self.listIdInternal[self.num_of_dim] += 1 + self.cur_list_id = self.listIdInternal[self.num_of_dim] + if self.num_of_dim not in self.spectral_dim: + self.spectral_dim[self.num_of_dim] = {} + if self.cur_list_id not in self.spectral_dim[self.num_of_dim]: + self.spectral_dim[self.num_of_dim][self.cur_list_id] = {} + for _dim_id in range(1, self.num_of_dim + 1): + self.spectral_dim[self.num_of_dim][self.cur_list_id][_dim_id] =\ + copy.copy(SPECTRAL_DIM_TEMPLATE + if len(self.cur_spectral_dim) == 0 + or _dim_id not in self.cur_spectral_dim + else self.cur_spectral_dim[_dim_id]) + self.spectral_dim[self.num_of_dim][self.cur_list_id][_dim_id]['freq_hint'] = [] + self.peaks3D = 0 + self.cur_spectral_dim = {} # Exit a parse tree produced by XeasyPKParser#peak_list_3d. - def exitPeak_list_3d(self, ctx:XeasyPKParser.Peak_list_3dContext): + def exitPeak_list_3d(self, ctx: XeasyPKParser.Peak_list_3dContext): # pylint: disable=unused-argument pass - # Enter a parse tree produced by XeasyPKParser#peak_3d. - def enterPeak_3d(self, ctx:XeasyPKParser.Peak_3dContext): - pass + def enterPeak_3d(self, ctx: XeasyPKParser.Peak_3dContext): # pylint: disable=unused-argument + self.peaks3D += 1 + + self.atomSelectionSet.clear() # Exit a parse tree produced by XeasyPKParser#peak_3d. - def exitPeak_3d(self, ctx:XeasyPKParser.Peak_3dContext): - pass + def exitPeak_3d(self, ctx: XeasyPKParser.Peak_3dContext): + + try: + + if len(self.numberSelection) == 0 or len(self.assignmentSelection) == 0: + self.peaks3D -= 1 + return + + index = int(str(ctx.Integer(0))) + x_ppm = float(str(ctx.Float(0))) + y_ppm = float(str(ctx.Float(1))) + z_ppm = float(str(ctx.Float(2))) + # color_code = int(str(ctx.Integer(1))) + # spectrum_type = str(ctx.Simple_name(0)) + vol = self.originalNumberSelection[0] + vol_err = self.originalNumberSelection[1] + # integral_method = str(ctx.Simple_name(1)) + type = int(str(ctx.Integer(2))) + + x_ass = self.assignmentSelection[0] + y_ass = self.assignmentSelection[1] + z_ass = self.assignmentSelection[2] + + if not self.hasPolySeq and not self.hasNonPolySeq: + return + + if x_ppm is None or y_ppm is None or z_ppm is None or type != 0: + self.peaks3D -= 1 + return + + dstFunc = self.validatePeak3D(index, x_ppm, y_ppm, z_ppm, None, None, None, None, None, None, + None, None, None, None, None, None, None, None, vol, vol_err) + + if dstFunc is None: + self.peaks3D -= 1 + return + + cur_spectral_dim = self.spectral_dim[self.num_of_dim][self.cur_list_id] + + cur_spectral_dim[1]['freq_hint'].append(x_ppm) + cur_spectral_dim[2]['freq_hint'].append(y_ppm) + cur_spectral_dim[3]['freq_hint'].append(z_ppm) + + has_assignments = False + + if x_ass is not None and y_ass is not None and z_ass is not None: + assignments = [{}] * self.num_of_dim + try: + assignments[0] = extractPeakAssignment(1, x_ass, self.authAsymIdSet, self.compIdSet, self.altCompIdSet, + self.polyPeptide, self.polyDeoxyribonucleotide, self.polyRibonucleotide, self.nefT)[0] + assignments[1] = extractPeakAssignment(1, y_ass, self.authAsymIdSet, self.compIdSet, self.altCompIdSet, + self.polyPeptide, self.polyDeoxyribonucleotide, self.polyRibonucleotide, self.nefT)[0] + assignments[2] = extractPeakAssignment(1, z_ass, self.authAsymIdSet, self.compIdSet, self.altCompIdSet, + self.polyPeptide, self.polyDeoxyribonucleotide, self.polyRibonucleotide, self.nefT)[0] + except Exception: + pass + + if all(len(a) > 0 for a in assignments): + + self.retrieveLocalSeqScheme() + + hasChainId = all(a['chain_id'] is not None for a in assignments) + hasCompId = all(a['comp_id'] is not None for a in assignments) + + a1 = assignments[0] + a2 = assignments[1] + a3 = assignments[2] + + if hasChainId and hasCompId: + chainAssign1, asis1 = self.assignCoordPolymerSequenceWithChainId(a1['chain_id'], a1['seq_id'], a1['comp_id'], a1['atom_id'], index) + chainAssign2, asis2 = self.assignCoordPolymerSequenceWithChainId(a2['chain_id'], a2['seq_id'], a2['comp_id'], a2['atom_id'], index) + chainAssign3, asis3 = self.assignCoordPolymerSequenceWithChainId(a3['chain_id'], a3['seq_id'], a3['comp_id'], a3['atom_id'], index) + + elif hasChainId: + chainAssign1 = self.assignCoordPolymerSequenceWithChainIdWithoutCompId(a1['chain_id'], a1['seq_id'], a1['atom_id'], index) + chainAssign2 = self.assignCoordPolymerSequenceWithChainIdWithoutCompId(a2['chain_id'], a2['seq_id'], a2['atom_id'], index) + chainAssign3 = self.assignCoordPolymerSequenceWithChainIdWithoutCompId(a3['chain_id'], a3['seq_id'], a3['atom_id'], index) + asis1 = asis2 = asis3 = False + + elif hasCompId: + chainAssign1, asis1 = self.assignCoordPolymerSequence(a1['chain_id'], a1['seq_id'], a1['comp_id'], a1['atom_id'], index) + chainAssign2, asis2 = self.assignCoordPolymerSequence(a2['chain_id'], a2['seq_id'], a2['comp_id'], a2['atom_id'], index) + chainAssign3, asis3 = self.assignCoordPolymerSequence(a3['chain_id'], a3['seq_id'], a3['comp_id'], a3['atom_id'], index) + + else: + chainAssign1 = self.assignCoordPolymerSequenceWithoutCompId(a1['seq_id'], a1['atom_id'], index) + chainAssign2 = self.assignCoordPolymerSequenceWithoutCompId(a2['seq_id'], a2['atom_id'], index) + chainAssign3 = self.assignCoordPolymerSequenceWithoutCompId(a3['seq_id'], a3['atom_id'], index) + asis1 = asis2 = asis3 = False + if len(chainAssign1) > 0 and len(chainAssign2) > 0 and len(chainAssign3) > 0: + self.selectCoordAtoms(chainAssign1, a1['seq_id'], a1['comp_id'], a1['atom_id'], index) + self.selectCoordAtoms(chainAssign2, a2['seq_id'], a2['comp_id'], a2['atom_id'], index) + self.selectCoordAtoms(chainAssign3, a3['seq_id'], a3['comp_id'], a3['atom_id'], index) + + if len(self.atomSelectionSet) == self.num_of_dim: + has_assignments = True + + if self.createSfDict__: + sf = self.getSf() + + if self.debug: + print(f"subtype={self.cur_subtype} id={self.peaks3D} (index={index}) " + f"{x_ass}, {y_ass}, {z_ass} -> {self.atomSelectionSet[0] if has_assignments else None} {self.atomSelectionSet[1] if has_assignments else None} " + f"{self.atomSelectionSet[2] if has_assignments else None} {dstFunc}") + + if self.createSfDict__ and sf is not None: + sf['index_id'] += 1 + ambig_code1 = ambig_code2 = ambig_code3 = None + if has_assignments: + atom1 = self.atomSelectionSet[0][0] + atom2 = self.atomSelectionSet[1][0] + atom3 = self.atomSelectionSet[2][0] + if len(self.atomSelectionSet[0]) > 1: + ambig_code1 = self.csStat.getMaxAmbigCodeWoSetId(atom1['comp_id'], atom1['atom_id']) + if ambig_code1 == 0: + ambig_code1 = None + if len(self.atomSelectionSet[1]) > 1: + ambig_code2 = self.csStat.getMaxAmbigCodeWoSetId(atom2['comp_id'], atom2['atom_id']) + if ambig_code2 == 0: + ambig_code2 = None + if len(self.atomSelectionSet[2]) > 1: + ambig_code3 = self.csStat.getMaxAmbigCodeWoSetId(atom3['comp_id'], atom3['atom_id']) + if ambig_code3 == 0: + ambig_code3 = None + else: + atom1 = atom2 = atom3 = None + + row = getPkRow(self.cur_subtype, sf['id'], sf['index_id'], + sf['list_id'], self.entryId, dstFunc, + self.authToStarSeq, self.authToOrigSeq, self.offsetHolder, + atom1, atom2, atom3, asis1=asis1, asis2=asis2, asis3=asis3, + ambig_code1=ambig_code1, ambig_code2=ambig_code2, + ambig_code3=ambig_code3) + sf['loop'].add_data(row) + + finally: + self.numberSelection.clear() + self.originalNumberSelection.clear() + self.assignmentSelection.clear() # Enter a parse tree produced by XeasyPKParser#peak_list_4d. - def enterPeak_list_4d(self, ctx:XeasyPKParser.Peak_list_4dContext): - pass + def enterPeak_list_4d(self, ctx: XeasyPKParser.Peak_list_4dContext): # pylint: disable=unused-argument + self.fillCurrentSpectralDim() + + self.num_of_dim = 4 + self.cur_subtype = 'peak4d' + if self.num_of_dim not in self.listIdInternal: + self.listIdInternal[self.num_of_dim] = 0 + self.listIdInternal[self.num_of_dim] += 1 + self.cur_list_id = self.listIdInternal[self.num_of_dim] + if self.num_of_dim not in self.spectral_dim: + self.spectral_dim[self.num_of_dim] = {} + if self.cur_list_id not in self.spectral_dim[self.num_of_dim]: + self.spectral_dim[self.num_of_dim][self.cur_list_id] = {} + for _dim_id in range(1, self.num_of_dim + 1): + self.spectral_dim[self.num_of_dim][self.cur_list_id][_dim_id] =\ + copy.copy(SPECTRAL_DIM_TEMPLATE + if len(self.cur_spectral_dim) == 0 + or _dim_id not in self.cur_spectral_dim + else self.cur_spectral_dim[_dim_id]) + self.spectral_dim[self.num_of_dim][self.cur_list_id][_dim_id]['freq_hint'] = [] + self.peaks4D = 0 + self.cur_spectral_dim = {} # Exit a parse tree produced by XeasyPKParser#peak_list_4d. - def exitPeak_list_4d(self, ctx:XeasyPKParser.Peak_list_4dContext): + def exitPeak_list_4d(self, ctx: XeasyPKParser.Peak_list_4dContext): # pylint: disable=unused-argument pass - # Enter a parse tree produced by XeasyPKParser#peak_4d. - def enterPeak_4d(self, ctx:XeasyPKParser.Peak_4dContext): - pass + def enterPeak_4d(self, ctx: XeasyPKParser.Peak_4dContext): # pylint: disable=unused-argument + self.peaks4D += 1 + + self.atomSelectionSet.clear() # Exit a parse tree produced by XeasyPKParser#peak_4d. - def exitPeak_4d(self, ctx:XeasyPKParser.Peak_4dContext): - pass + def exitPeak_4d(self, ctx: XeasyPKParser.Peak_4dContext): + + try: + + if len(self.numberSelection) == 0 or len(self.assignmentSelection) == 0: + self.peaks4D -= 1 + return + + index = int(str(ctx.Integer(0))) + x_ppm = float(str(ctx.Float(0))) + y_ppm = float(str(ctx.Float(1))) + z_ppm = float(str(ctx.Float(2))) + a_ppm = float(str(ctx.Float(3))) + # color_code = int(str(ctx.Integer(1))) + # spectrum_type = str(ctx.Simple_name(0)) + vol = self.originalNumberSelection[0] + vol_err = self.originalNumberSelection[1] + # integral_method = str(ctx.Simple_name(1)) + type = int(str(ctx.Integer(2))) + + x_ass = self.assignmentSelection[0] + y_ass = self.assignmentSelection[1] + z_ass = self.assignmentSelection[2] + a_ass = self.assignmentSelection[3] + + if not self.hasPolySeq and not self.hasNonPolySeq: + return + + if x_ppm is None or y_ppm is None or z_ppm is None or a_ppm is None or type != 0: + self.peaks4D -= 1 + return + + dstFunc = self.validatePeak4D(index, x_ppm, y_ppm, z_ppm, a_ppm, None, None, None, None, None, None, None, None, + None, None, None, None, None, None, None, None, None, None, vol, vol_err) + + if dstFunc is None: + self.peaks4D -= 1 + return + + cur_spectral_dim = self.spectral_dim[self.num_of_dim][self.cur_list_id] + + cur_spectral_dim[1]['freq_hint'].append(x_ppm) + cur_spectral_dim[2]['freq_hint'].append(y_ppm) + cur_spectral_dim[3]['freq_hint'].append(z_ppm) + cur_spectral_dim[4]['freq_hint'].append(a_ppm) + + has_assignments = False + + if x_ass is not None and y_ass is not None and z_ass is not None and a_ass is not None: + assignments = [{}] * self.num_of_dim + try: + assignments[0] = extractPeakAssignment(1, x_ass, self.authAsymIdSet, self.compIdSet, self.altCompIdSet, + self.polyPeptide, self.polyDeoxyribonucleotide, self.polyRibonucleotide, self.nefT)[0] + assignments[1] = extractPeakAssignment(1, y_ass, self.authAsymIdSet, self.compIdSet, self.altCompIdSet, + self.polyPeptide, self.polyDeoxyribonucleotide, self.polyRibonucleotide, self.nefT)[0] + assignments[2] = extractPeakAssignment(1, z_ass, self.authAsymIdSet, self.compIdSet, self.altCompIdSet, + self.polyPeptide, self.polyDeoxyribonucleotide, self.polyRibonucleotide, self.nefT)[0] + assignments[3] = extractPeakAssignment(1, a_ass, self.authAsymIdSet, self.compIdSet, self.altCompIdSet, + self.polyPeptide, self.polyDeoxyribonucleotide, self.polyRibonucleotide, self.nefT)[0] + except Exception: + pass + if all(len(a) > 0 for a in assignments): + + self.retrieveLocalSeqScheme() + + hasChainId = all(a['chain_id'] is not None for a in assignments) + hasCompId = all(a['comp_id'] is not None for a in assignments) + + a1 = assignments[0] + a2 = assignments[1] + a3 = assignments[2] + a4 = assignments[3] + + if hasChainId and hasCompId: + chainAssign1, asis1 = self.assignCoordPolymerSequenceWithChainId(a1['chain_id'], a1['seq_id'], a1['comp_id'], a1['atom_id'], index) + chainAssign2, asis2 = self.assignCoordPolymerSequenceWithChainId(a2['chain_id'], a2['seq_id'], a2['comp_id'], a2['atom_id'], index) + chainAssign3, asis3 = self.assignCoordPolymerSequenceWithChainId(a3['chain_id'], a3['seq_id'], a3['comp_id'], a3['atom_id'], index) + chainAssign4, asis4 = self.assignCoordPolymerSequenceWithChainId(a4['chain_id'], a4['seq_id'], a4['comp_id'], a4['atom_id'], index) + + elif hasChainId: + chainAssign1 = self.assignCoordPolymerSequenceWithChainIdWithoutCompId(a1['chain_id'], a1['seq_id'], a1['atom_id'], index) + chainAssign2 = self.assignCoordPolymerSequenceWithChainIdWithoutCompId(a2['chain_id'], a2['seq_id'], a2['atom_id'], index) + chainAssign3 = self.assignCoordPolymerSequenceWithChainIdWithoutCompId(a3['chain_id'], a3['seq_id'], a3['atom_id'], index) + chainAssign4 = self.assignCoordPolymerSequenceWithChainIdWithoutCompId(a4['chain_id'], a4['seq_id'], a4['atom_id'], index) + asis1 = asis2 = asis3 = asis4 = False + + elif hasCompId: + chainAssign1, asis1 = self.assignCoordPolymerSequence(a1['chain_id'], a1['seq_id'], a1['comp_id'], a1['atom_id'], index) + chainAssign2, asis2 = self.assignCoordPolymerSequence(a2['chain_id'], a2['seq_id'], a2['comp_id'], a2['atom_id'], index) + chainAssign3, asis3 = self.assignCoordPolymerSequence(a3['chain_id'], a3['seq_id'], a3['comp_id'], a3['atom_id'], index) + chainAssign4, asis4 = self.assignCoordPolymerSequence(a4['chain_id'], a4['seq_id'], a4['comp_id'], a4['atom_id'], index) + + else: + chainAssign1 = self.assignCoordPolymerSequenceWithoutCompId(a1['seq_id'], a1['atom_id'], index) + chainAssign2 = self.assignCoordPolymerSequenceWithoutCompId(a2['seq_id'], a2['atom_id'], index) + chainAssign3 = self.assignCoordPolymerSequenceWithoutCompId(a3['seq_id'], a3['atom_id'], index) + chainAssign4 = self.assignCoordPolymerSequenceWithoutCompId(a4['seq_id'], a4['atom_id'], index) + asis1 = asis2 = asis3 = asis4 = False + + if len(chainAssign1) > 0 and len(chainAssign2) > 0 and len(chainAssign3) > 0 and len(chainAssign4) > 0: + self.selectCoordAtoms(chainAssign1, a1['seq_id'], a1['comp_id'], a1['atom_id'], index) + self.selectCoordAtoms(chainAssign2, a2['seq_id'], a2['comp_id'], a2['atom_id'], index) + self.selectCoordAtoms(chainAssign3, a3['seq_id'], a3['comp_id'], a3['atom_id'], index) + self.selectCoordAtoms(chainAssign4, a4['seq_id'], a4['comp_id'], a4['atom_id'], index) + + if len(self.atomSelectionSet) == self.num_of_dim: + has_assignments = True + + if self.createSfDict__: + sf = self.getSf() + + if self.debug: + print(f"subtype={self.cur_subtype} id={self.peaks4D} (index={index}) " + f"{x_ass}, {y_ass}, {z_ass}, {a_ass} -> {self.atomSelectionSet[0] if has_assignments else None} {self.atomSelectionSet[1] if has_assignments else None} " + f"{self.atomSelectionSet[2] if has_assignments else None} {self.atomSelectionSet[3] if has_assignments else None} {dstFunc}") + + if self.createSfDict__ and sf is not None: + sf['index_id'] += 1 + ambig_code1 = ambig_code2 = ambig_code3 = ambig_code4 = None + if has_assignments: + atom1 = self.atomSelectionSet[0][0] + atom2 = self.atomSelectionSet[1][0] + atom3 = self.atomSelectionSet[2][0] + atom4 = self.atomSelectionSet[3][0] + if len(self.atomSelectionSet[0]) > 1: + ambig_code1 = self.csStat.getMaxAmbigCodeWoSetId(atom1['comp_id'], atom1['atom_id']) + if ambig_code1 == 0: + ambig_code1 = None + if len(self.atomSelectionSet[1]) > 1: + ambig_code2 = self.csStat.getMaxAmbigCodeWoSetId(atom2['comp_id'], atom2['atom_id']) + if ambig_code2 == 0: + ambig_code2 = None + if len(self.atomSelectionSet[2]) > 1: + ambig_code3 = self.csStat.getMaxAmbigCodeWoSetId(atom3['comp_id'], atom3['atom_id']) + if ambig_code3 == 0: + ambig_code3 = None + if len(self.atomSelectionSet[3]) > 1: + ambig_code4 = self.csStat.getMaxAmbigCodeWoSetId(atom4['comp_id'], atom4['atom_id']) + if ambig_code4 == 0: + ambig_code4 = None + else: + atom1 = atom2 = atom3 = atom4 = None + + row = getPkRow(self.cur_subtype, sf['id'], sf['index_id'], + sf['list_id'], self.entryId, dstFunc, + self.authToStarSeq, self.authToOrigSeq, self.offsetHolder, + atom1, atom2, atom3, atom4, asis1=asis1, asis2=asis2, asis3=asis3, asis4=asis4, + ambig_code1=ambig_code1, ambig_code2=ambig_code2, + ambig_code3=ambig_code3, ambig_code4=ambig_code4) + sf['loop'].add_data(row) + + finally: + self.numberSelection.clear() + self.originalNumberSelection.clear() + self.assignmentSelection.clear() # Enter a parse tree produced by XeasyPKParser#number. - def enterNumber(self, ctx:XeasyPKParser.NumberContext): + def enterNumber(self, ctx: XeasyPKParser.NumberContext): # pylint: disable=unused-argument pass # Exit a parse tree produced by XeasyPKParser#number. - def exitNumber(self, ctx:XeasyPKParser.NumberContext): - pass + def exitNumber(self, ctx: XeasyPKParser.NumberContext): + if ctx.Float(): + value = str(ctx.Float()) + self.numberSelection.append(float(value)) + self.originalNumberSelection.append(value) + elif ctx.Real(): + value = str(ctx.Real()) + self.numberSelection.append(float(value)) + self.originalNumberSelection.append(value) + + elif ctx.Integer(): + value = str(ctx.Integer()) + self.numberSelection.append(int(value)) + self.originalNumberSelection.append(value) + + else: + self.numberSelection.append(None) + self.originalNumberSelection.append(None) # Enter a parse tree produced by XeasyPKParser#assign. - def enterAssign(self, ctx:XeasyPKParser.AssignContext): + def enterAssign(self, ctx: XeasyPKParser.AssignContext): # pylint: disable=unused-argument pass # Exit a parse tree produced by XeasyPKParser#assign. - def exitAssign(self, ctx:XeasyPKParser.AssignContext): - pass + def exitAssign(self, ctx: XeasyPKParser.AssignContext): + if ctx.Simple_name() and ctx.Integer(): + self.assignmentSelection.append(str(ctx.Integer()) + str(ctx.Simple_name())) + else: + self.assignmentSelection.append(None) + + def fillCurrentSpectralDim(self): + for _dim_id in range(1, self.num_of_dim + 1): + cur_spectral_dim = copy.copy(SPECTRAL_DIM_TEMPLATE) + if _dim_id in self.__labels: + cur_spectral_dim['axis_code'] = _axis_code = self.__labels[_dim_id] + + digits = re.findall(r'\d+', _axis_code) + for digit in digits: + num = int(digit) + nuc = next((k for k, v in ISOTOPE_NUMBERS_OF_NMR_OBS_NUCS.items() if num == v[0]), None) + if nuc is not None: + cur_spectral_dim['atom_type'] = nuc + cur_spectral_dim['atom_isotope_number'] = num + break + if cur_spectral_dim['atom_type'] is None: + for a in _axis_code: + a = a.upper() + if a in ISOTOPE_NUMBERS_OF_NMR_OBS_NUCS: + cur_spectral_dim['atom_type'] = a + cur_spectral_dim['atom_isotope_number'] = ISOTOPE_NUMBERS_OF_NMR_OBS_NUCS[a][0] + break + + isotope_number = cur_spectral_dim['atom_isotope_number'] + + cur_spectral_dim['acquisition'] = 'yes' if _dim_id == self.acq_dim_id\ + and (isotope_number == 1 or (isotope_number == 13 and self.exptlMethod == 'SOLID-STATE NMR')) else 'no' + + if _dim_id == 1 and cur_spectral_dim['acquisition'] == 'no': + self.acq_dim_id = self.num_of_dim + + cur_spectral_dim['under_sampling_type'] = 'not observed' if cur_spectral_dim['acquisition'] == 'yes' else 'aliased' + self.cur_spectral_dim[_dim_id] = cur_spectral_dim -del XeasyPKParser \ No newline at end of file +# del XeasyPKParser diff --git a/wwpdb/utils/nmr/pk/XeasyPKReader.py b/wwpdb/utils/nmr/pk/XeasyPKReader.py new file mode 100644 index 00000000..78503ee9 --- /dev/null +++ b/wwpdb/utils/nmr/pk/XeasyPKReader.py @@ -0,0 +1,216 @@ +## +# XeasyPKReader.py +# +# Update: +## +""" A collection of classes for parsing XEASY PK files. +""" +import sys +import os + +from antlr4 import InputStream, CommonTokenStream, ParseTreeWalker + +try: + from wwpdb.utils.nmr.mr.LexerErrorListener import LexerErrorListener + from wwpdb.utils.nmr.mr.ParserErrorListener import ParserErrorListener + from wwpdb.utils.nmr.pk.XeasyPKLexer import XeasyPKLexer + from wwpdb.utils.nmr.pk.XeasyPKParser import XeasyPKParser + from wwpdb.utils.nmr.pk.XeasyPKParserListener import XeasyPKParserListener + from wwpdb.utils.nmr.mr.ParserListenerUtil import (coordAssemblyChecker, + MAX_ERROR_REPORT, + REPRESENTATIVE_MODEL_ID, + REPRESENTATIVE_ALT_ID) + from wwpdb.utils.nmr.io.CifReader import CifReader + from wwpdb.utils.nmr.ChemCompUtil import ChemCompUtil + from wwpdb.utils.nmr.BMRBChemShiftStat import BMRBChemShiftStat + from wwpdb.utils.nmr.NEFTranslator.NEFTranslator import NEFTranslator +except ImportError: + from nmr.mr.LexerErrorListener import LexerErrorListener + from nmr.mr.ParserErrorListener import ParserErrorListener + from nmr.pk.XeasyPKLexer import XeasyPKLexer + from nmr.pk.XeasyPKParser import XeasyPKParser + from nmr.pk.XeasyPKParserListener import XeasyPKParserListener + from nmr.mr.ParserListenerUtil import (coordAssemblyChecker, + MAX_ERROR_REPORT, + REPRESENTATIVE_MODEL_ID, + REPRESENTATIVE_ALT_ID) + from nmr.io.CifReader import CifReader + from nmr.ChemCompUtil import ChemCompUtil + from nmr.BMRBChemShiftStat import BMRBChemShiftStat + from nmr.NEFTranslator.NEFTranslator import NEFTranslator + + +class XeasyPKReader: + """ Accessor methods for parsing XEASY PK files. + """ + + def __init__(self, verbose=True, log=sys.stdout, + representativeModelId=REPRESENTATIVE_MODEL_ID, + representativeAltId=REPRESENTATIVE_ALT_ID, + mrAtomNameMapping=None, + cR=None, caC=None, ccU=None, csStat=None, nefT=None, + reasons=None): + self.__verbose = verbose + self.__lfh = log + self.__debug = False + + self.__maxLexerErrorReport = MAX_ERROR_REPORT + self.__maxParserErrorReport = MAX_ERROR_REPORT + + self.__representativeModelId = representativeModelId + self.__representativeAltId = representativeAltId + self.__mrAtomNameMapping = mrAtomNameMapping + + # CCD accessing utility + self.__ccU = ChemCompUtil(verbose, log) if ccU is None else ccU + + if cR is not None and caC is None: + caC = coordAssemblyChecker(verbose, log, representativeModelId, representativeAltId, + cR, self.__ccU, None, None, fullCheck=False) + + self.__cR = cR + self.__caC = caC + + # BMRB chemical shift statistics + self.__csStat = BMRBChemShiftStat(verbose, log, self.__ccU) if csStat is None else csStat + + # NEFTranslator + self.__nefT = NEFTranslator(verbose, log, self.__ccU, self.__csStat) if nefT is None else nefT + if nefT is None: + self.__nefT.set_remediation_mode(True) + + # reasons for re-parsing request from the previous trial + self.__reasons = reasons + + def setDebugMode(self, debug): + self.__debug = debug + + def setLexerMaxErrorReport(self, maxErrReport): + self.__maxLexerErrorReport = maxErrReport + + def setParserMaxErrorReport(self, maxErrReport): + self.__maxParserErrorReport = maxErrReport + + def parse(self, pkFilePath, cifFilePath=None, isFilePath=True, + createSfDict=False, originalFileName=None, listIdCounter=None, entryId=None): + """ Parse XEASY PK file. + @return: XeasyPKParserListener for success or None otherwise, ParserErrorListener, LexerErrorListener. + """ + + ifh = None + + try: + + if isFilePath: + pkString = None + + if not os.access(pkFilePath, os.R_OK): + if self.__verbose: + self.__lfh.write(f"XeasyPKReader.parse() {pkFilePath} is not accessible.\n") + return None, None, None + + ifh = open(pkFilePath, 'r') # pylint: disable=consider-using-with + input = InputStream(ifh.read()) + + else: + pkFilePath, pkString = None, pkFilePath + + if pkString is None or len(pkString) == 0: + if self.__verbose: + self.__lfh.write("XeasyPKReader.parse() Empty string.\n") + return None, None, None + + input = InputStream(pkString) + + if cifFilePath is not None: + if not os.access(cifFilePath, os.R_OK): + if self.__verbose: + self.__lfh.write(f"XeasyPKReader.parse() {cifFilePath} is not accessible.\n") + return None, None, None + + if self.__cR is None: + self.__cR = CifReader(self.__verbose, self.__lfh) + if not self.__cR.parse(cifFilePath): + return None, None, None + + lexer = XeasyPKLexer(input) + lexer.removeErrorListeners() + + lexer_error_listener = LexerErrorListener(pkFilePath, maxErrorReport=self.__maxLexerErrorReport) + lexer.addErrorListener(lexer_error_listener) + + messageList = lexer_error_listener.getMessageList() + + if messageList is not None and self.__verbose: + for description in messageList: + self.__lfh.write(f"[Syntax error] line {description['line_number']}:{description['column_position']} {description['message']}\n") + if 'input' in description: + self.__lfh.write(f"{description['input']}\n") + self.__lfh.write(f"{description['marker']}\n") + + stream = CommonTokenStream(lexer) + parser = XeasyPKParser(stream) + # try with simpler/faster SLL prediction mode + # parser._interp.predictionMode = PredictionMode.SLL # pylint: disable=protected-access + parser.removeErrorListeners() + parser_error_listener = ParserErrorListener(pkFilePath, maxErrorReport=self.__maxParserErrorReport) + parser.addErrorListener(parser_error_listener) + tree = parser.xeasy_pk() + + walker = ParseTreeWalker() + listener = XeasyPKParserListener(self.__verbose, self.__lfh, + self.__representativeModelId, + self.__representativeAltId, + self.__mrAtomNameMapping, + self.__cR, self.__caC, + self.__ccU, self.__csStat, self.__nefT, + self.__reasons) + listener.setDebugMode(self.__debug) + listener.createSfDict(createSfDict) + if createSfDict: + if originalFileName is not None: + listener.setOriginaFileName(originalFileName) + if listIdCounter is not None: + listener.setListIdCounter(listIdCounter) + if entryId is not None: + listener.setEntryId(entryId) + walker.walk(listener, tree) + + messageList = parser_error_listener.getMessageList() + + if messageList is not None and self.__verbose: + for description in messageList: + self.__lfh.write(f"[Syntax error] line {description['line_number']}:{description['column_position']} {description['message']}\n") + if 'input' in description: + self.__lfh.write(f"{description['input']}\n") + self.__lfh.write(f"{description['marker']}\n") + + if self.__verbose: + if listener.warningMessage is not None and len(listener.warningMessage) > 0: + print('\n'.join(listener.warningMessage)) + if isFilePath: + print(listener.getContentSubtype()) + + return listener, parser_error_listener, lexer_error_listener + + except IOError as e: + if self.__verbose: + self.__lfh.write(f"+XeasyPKReader.parse() ++ Error - {str(e)}\n") + return None, None, None + # pylint: disable=unreachable + """ debug code + except Exception as e: + if self.__verbose and isFilePath: + self.__lfh.write(f"+XeasyPKReader.parse() ++ Error - {pkFilePath!r} - {str(e)}\n") + return None, None, None + """ + finally: + if isFilePath and ifh is not None: + ifh.close() + + +if __name__ == "__main__": + reader = XeasyPKReader(True) + reader.setDebugMode(True) + reader.parse('../../tests-nmr/mock-data-remediation/7a2d/aro.peaks', # -ignored-as-pea-any', + '../../tests-nmr/mock-data-remediation/7a2d/7a2d.cif') diff --git a/wwpdb/utils/tests-nmr/antlr-grammars-v4.10/NmrViewPKParser.g4 b/wwpdb/utils/tests-nmr/antlr-grammars-v4.10/NmrViewPKParser.g4 index 5f490bfd..701b3984 100644 --- a/wwpdb/utils/tests-nmr/antlr-grammars-v4.10/NmrViewPKParser.g4 +++ b/wwpdb/utils/tests-nmr/antlr-grammars-v4.10/NmrViewPKParser.g4 @@ -37,7 +37,7 @@ nmrview_pk: data_label: Label Dataset Sw Sf RETURN_LA labels RETURN_LA - Simple_name_LA RETURN_LA + Simple_name_LA+ RETURN_LA labels RETURN_LA labels RETURN_LA; diff --git a/wwpdb/utils/tests-nmr/antlr-grammars-v4.10/XeasyPKLexer.g4 b/wwpdb/utils/tests-nmr/antlr-grammars-v4.10/XeasyPKLexer.g4 index 8a0fdfc3..df9a43fe 100644 --- a/wwpdb/utils/tests-nmr/antlr-grammars-v4.10/XeasyPKLexer.g4 +++ b/wwpdb/utils/tests-nmr/antlr-grammars-v4.10/XeasyPKLexer.g4 @@ -35,7 +35,6 @@ fragment DEC_DOT_DEC: (DECIMAL '.' DECIMAL) | ('.' DECIMAL); fragment DEC_DIGIT: [0-9]; fragment DECIMAL: DEC_DIGIT+; -SHARP_COMMENT: '#'+ ~[\r\n]* '#'* ~[\r\n]* -> channel(HIDDEN); EXCLM_COMMENT: '!'+ ~[\r\n]* '!'* ~[\r\n]* -> channel(HIDDEN); SMCLN_COMMENT: ';'+ ~[\r\n]* ';'* ~[\r\n]* -> channel(HIDDEN); @@ -55,8 +54,8 @@ SPACE: [ \t\r\n]+ -> skip; RETURN: [\r\n]+; ENCLOSE_COMMENT: '{' (ENCLOSE_COMMENT | .)*? '}' -> channel(HIDDEN); -SECTION_COMMENT: ('#' | '!' | ';' | '\\' | '&' | '/' '/'+ | '*' '*'+ | '=' '='+ | 'REMARK') ' '* RETURN -> channel(HIDDEN); -LINE_COMMENT: ('#' | '!' | ';' | '\\' | '&' | '/' '/'+ | '*' '*'+ | '=' '='+ | 'REMARK') ~[\r\n]* RETURN -> channel(HIDDEN); +SECTION_COMMENT: ('!' | ';' | '\\' | '&' | '/' '/'+ | '*' '*'+ | '=' '='+ | 'REMARK') ' '* RETURN -> channel(HIDDEN); +LINE_COMMENT: ('!' | ';' | '\\' | '&' | '/' '/'+ | '*' '*'+ | '=' '='+ | 'REMARK') ~[\r\n]* RETURN -> channel(HIDDEN); mode NUM_OF_DIM_MODE; diff --git a/wwpdb/utils/tests-nmr/antlr-grammars-v4.10/XeasyPKParser.g4 b/wwpdb/utils/tests-nmr/antlr-grammars-v4.10/XeasyPKParser.g4 index ac6f2233..c6ee2f17 100644 --- a/wwpdb/utils/tests-nmr/antlr-grammars-v4.10/XeasyPKParser.g4 +++ b/wwpdb/utils/tests-nmr/antlr-grammars-v4.10/XeasyPKParser.g4 @@ -21,6 +21,7 @@ options { tokenVocab=XeasyPKLexer; } xeasy_pk: ( dimension | + format | iname | cyana_format | spectrum | @@ -34,6 +35,9 @@ xeasy_pk: dimension: Num_of_dim Integer_ND RETURN_ND; +format: + Format Simple_name_FO RETURN_FO; + iname: Iname Integer_IN Simple_name_IN RETURN_IN; @@ -54,7 +58,7 @@ peak_2d: Float Float Integer Simple_name number number - Simple_name + Simple_name Integer assign assign; peak_list_3d: @@ -65,7 +69,7 @@ peak_3d: Float Float Float Integer Simple_name number number - Simple_name + Simple_name Integer assign assign assign; peak_list_4d: @@ -76,12 +80,12 @@ peak_4d: Float Float Float Float Integer Simple_name number number - Simple_name + Simple_name Integer assign assign assign assign; /* number expression in peak list */ number: Float | Real | Integer | Simple_name; /* assignment expression in peak list */ -assign: Integer | Simple_name Integer?; +assign: Integer | (Simple_name Integer?);