From bdfa21d3278406d6b036792d0274d553f5e986f4 Mon Sep 17 00:00:00 2001 From: yokochi47 Date: Thu, 28 Nov 2024 15:29:40 +0900 Subject: [PATCH] Add spectral peak list lexer and parser grammars for NmrPipe, NmrView, Sparky, and Xeasy Add spectral peak list file types for ARIA (nm-pea-ari) and XWIN-NMR (nm-pea-xwi) --- .../utils/nmr/NEFTranslator/NEFTranslator.py | 16 +- wwpdb/utils/nmr/NmrDpUtility.py | 65 ++----- .../antlr-grammars-v4.10/NmrPipePKLexer.g4 | 167 ++++++++++++++++++ .../antlr-grammars-v4.10/NmrPipePKParser.g4 | 161 +++++++++++++++++ .../antlr-grammars-v4.10/NmrViewPKLexer.g4 | 74 ++++++++ .../antlr-grammars-v4.10/NmrViewPKParser.g4 | 74 ++++++++ .../antlr-grammars-v4.10/SparkyPKLexer.g4 | 68 +++++++ .../antlr-grammars-v4.10/SparkyPKParser.g4 | 50 ++++++ .../antlr-grammars-v4.10/XeasyPKLexer.g4 | 101 +++++++++++ .../antlr-grammars-v4.10/XeasyPKParser.g4 | 87 +++++++++ .../antlr-grammars-v4.9/NmrPipePKLexer.g4 | 1 + .../antlr-grammars-v4.9/NmrPipePKParser.g4 | 1 + .../antlr-grammars-v4.9/NmrViewPKLexer.g4 | 1 + .../antlr-grammars-v4.9/NmrViewPKParser.g4 | 1 + .../antlr-grammars-v4.9/SparkyPKLexer.g4 | 1 + .../antlr-grammars-v4.9/SparkyPKParser.g4 | 1 + .../antlr-grammars-v4.9/XeasyPKLexer.g4 | 1 + .../antlr-grammars-v4.9/XeasyPKParser.g4 | 1 + .../nmr-data-procesing-report-schema-v4.json | 4 +- 19 files changed, 816 insertions(+), 59 deletions(-) create mode 100644 wwpdb/utils/tests-nmr/antlr-grammars-v4.10/NmrPipePKLexer.g4 create mode 100644 wwpdb/utils/tests-nmr/antlr-grammars-v4.10/NmrPipePKParser.g4 create mode 100644 wwpdb/utils/tests-nmr/antlr-grammars-v4.10/NmrViewPKLexer.g4 create mode 100644 wwpdb/utils/tests-nmr/antlr-grammars-v4.10/NmrViewPKParser.g4 create mode 100644 wwpdb/utils/tests-nmr/antlr-grammars-v4.10/SparkyPKLexer.g4 create mode 100644 wwpdb/utils/tests-nmr/antlr-grammars-v4.10/SparkyPKParser.g4 create mode 100644 wwpdb/utils/tests-nmr/antlr-grammars-v4.10/XeasyPKLexer.g4 create mode 100644 wwpdb/utils/tests-nmr/antlr-grammars-v4.10/XeasyPKParser.g4 create mode 120000 wwpdb/utils/tests-nmr/antlr-grammars-v4.9/NmrPipePKLexer.g4 create mode 120000 wwpdb/utils/tests-nmr/antlr-grammars-v4.9/NmrPipePKParser.g4 create mode 120000 wwpdb/utils/tests-nmr/antlr-grammars-v4.9/NmrViewPKLexer.g4 create mode 120000 wwpdb/utils/tests-nmr/antlr-grammars-v4.9/NmrViewPKParser.g4 create mode 120000 wwpdb/utils/tests-nmr/antlr-grammars-v4.9/SparkyPKLexer.g4 create mode 120000 wwpdb/utils/tests-nmr/antlr-grammars-v4.9/SparkyPKParser.g4 create mode 120000 wwpdb/utils/tests-nmr/antlr-grammars-v4.9/XeasyPKLexer.g4 create mode 120000 wwpdb/utils/tests-nmr/antlr-grammars-v4.9/XeasyPKParser.g4 diff --git a/wwpdb/utils/nmr/NEFTranslator/NEFTranslator.py b/wwpdb/utils/nmr/NEFTranslator/NEFTranslator.py index 935cac37..f7e3628b 100644 --- a/wwpdb/utils/nmr/NEFTranslator/NEFTranslator.py +++ b/wwpdb/utils/nmr/NEFTranslator/NEFTranslator.py @@ -4707,9 +4707,7 @@ def skip_empty_value_error(lp, idx): for idx, row in enumerate(tag_data): ent = {} # entity - missing_mandatory_data = False - remove_bad_pattern = False - clear_bad_pattern = False + missing_mandatory_data = remove_bad_pattern = clear_bad_pattern = False for j in range(tag_len): name = tags[j] @@ -12391,8 +12389,7 @@ def get_nef_sf_framecode(sf, prefix): entity_del_atom_loop = next((loop for loop in saveframe if loop.category == '_Entity_deleted_atom'), None) - has_pk_can_format = False - has_pk_row_format = False + has_pk_can_format = has_pk_row_format = False for loop in saveframe: @@ -12453,8 +12450,7 @@ def get_nef_sf_framecode(sf, prefix): pass if saveframe.category == 'entry_information': - has_format_name = False - has_format_ver = False + has_format_name = has_format_ver = False for tags in sf.tags: if tags[0] == 'format_name': has_format_name = True @@ -12594,8 +12590,7 @@ def get_nef_sf_framecode(sf, prefix): entity_del_atom_loop = next((loop for loop in saveframe if loop.category == '_Entity_deleted_atom'), None) - has_pk_can_format = False - has_pk_row_format = False + has_pk_can_format = has_pk_row_format = False for loop in saveframe: @@ -12656,8 +12651,7 @@ def get_nef_sf_framecode(sf, prefix): pass if sf.category == 'entry_information': - has_format_name = False - has_format_ver = False + has_format_name = has_format_ver = False for tags in sf.tags: if tags[0] == 'format_name': has_format_name = True diff --git a/wwpdb/utils/nmr/NmrDpUtility.py b/wwpdb/utils/nmr/NmrDpUtility.py index 60707631..80fe3ab5 100644 --- a/wwpdb/utils/nmr/NmrDpUtility.py +++ b/wwpdb/utils/nmr/NmrDpUtility.py @@ -10285,23 +10285,9 @@ def __detectContentSubTypeOfLegacyMr(self): 'nm-res-isd', 'nm-res-ari', 'nm-res-oth') or is_aux_amb or is_aux_gro or is_aux_cha else 1)) cs_atom_like_names = list(filter(is_half_spin_nuclei, atom_like_names)) # DAOTHER-7491 - has_chem_shift = False - has_dist_restraint = False - has_dihed_restraint = False - has_rdc_restraint = False - has_plane_restraint = False - has_hbond_restraint = False - has_ssbond_restraint = False - has_rdc_origins = False - has_spectral_peak = False - - has_coordinate = False - has_amb_coord = False - has_amb_inpcrd = False - has_ens_coord = False - has_topology = False - - has_first_atom = False + has_chem_shift = has_dist_restraint = has_dihed_restraint = has_rdc_restraint =\ + has_plane_restraint = has_hbond_restraint = has_ssbond_restraint = has_rdc_origins = has_spectral_peak =\ + has_coordinate = has_amb_coord = has_amb_inpcrd = has_ens_coord = has_topology = has_first_atom = False if file_type in ('nm-res-xpl', 'nm-res-cns'): @@ -10309,11 +10295,10 @@ def __detectContentSubTypeOfLegacyMr(self): atom_likes = atom_unlikes = cs_atom_likes = resid_likes = real_likes = 0 names, resids = [], [] + cs_range_like = dist_range_like = dihed_range_like = rdc_range_like = False rdc_atom_names = set() - cs_range_like = dist_range_like = dihed_range_like = rdc_range_like = False - for line in ifh: if line.startswith('ATOM ') and line.count('.') >= 3: @@ -10475,15 +10460,13 @@ def __detectContentSubTypeOfLegacyMr(self): elif file_type == 'nm-res-amb': with open(file_path, 'r', encoding='utf-8') as ifh: - - in_rst = in_iat = in_igr1 = in_igr2 = False + in_rst = in_iat = in_igr1 = in_igr2 =\ + dist_range_like = dihed_range_like = rdc_range_like = False names, values = [], [] pos = 0 - dist_range_like = dihed_range_like = rdc_range_like = False - for line in ifh: if line.startswith('ATOM ') and line.count('.') >= 3: @@ -10663,19 +10646,16 @@ def __detectContentSubTypeOfLegacyMr(self): if is_aux_amb: - has_atom_name = has_residue_label = has_residue_pointer = has_amb_atom_type = False - - chk_atom_name_format = chk_residue_label_format = chk_residue_pointer_format = chk_amb_atom_type_format = False - - in_atom_name = in_residue_label = in_residue_pointer = in_amb_atom_type = False + has_atom_name = has_residue_label = has_residue_pointer = has_amb_atom_type =\ + chk_atom_name_format = chk_residue_label_format = chk_residue_pointer_format = chk_amb_atom_type_format =\ + in_atom_name = in_residue_label = in_residue_pointer = in_amb_atom_type = False atom_names = residue_labels = residue_pointers = amb_atom_types = 0 elif is_aux_gro: - has_system = has_molecules = has_atoms = False - - in_system = in_molecules = in_atoms = False + has_system = has_molecules = has_atoms =\ + in_system = in_molecules = in_atoms = False system_names = molecule_names = atom_names = 0 @@ -11815,9 +11795,8 @@ def __detectContentSubTypeOfLegacyPk(self): try: header = True - in_header = pdb_record = cs_str = mr_str = False - - has_datablock = has_anonymous_saveframe = has_save = has_loop = has_stop = False + in_header = pdb_record = cs_str = mr_str =\ + has_datablock = has_anonymous_saveframe = has_save = has_loop = has_stop = False first_str_line_num = last_str_line_num = -1 @@ -14657,9 +14636,8 @@ def __extractPublicMrFileIntoLegacyMr(self): try: header = True - in_header = pdb_record = footer = False - - has_datablock = has_anonymous_saveframe = has_save = has_loop = has_stop = False + in_header = pdb_record = footer =\ + has_datablock = has_anonymous_saveframe = has_save = has_loop = has_stop = False first_str_line_num = last_str_line_num = -1 @@ -18276,7 +18254,6 @@ def __appendPolymerSequenceAlignment(self): """ is_done = True - update_poly_seq = False self.__alt_chain = False @@ -25760,9 +25737,7 @@ def fill_cs_row(lp, index, _row, prefer_auth_atom_name, coord_atom_site, _seq_ke while True: - regenerate_request = False # DAOTHER-9065 - - can_auth_asym_id_mapping_failed = False # DAOTHER-9158 + regenerate_request = can_auth_asym_id_mapping_failed = False # DAOTHER-9065, DAOTHER-9158 lp.clear_data() @@ -52306,13 +52281,11 @@ def __resetBoolValueInLoop(self): key_items = self.key_items[file_type][content_subtype] data_items = self.data_items[file_type][content_subtype] - has_bool_key = False + has_bool_key = has_bool_data = False if key_items is not None: has_bool_key = next((k['type'] == 'bool' for k in key_items if k['type'] == 'bool'), False) - has_bool_data = False - if data_items is not None: has_bool_data = next((d['type'] == 'bool' for d in data_items if d['type'] == 'bool'), False) @@ -52408,13 +52381,11 @@ def __resetBoolValueInAuxLoop(self): key_items = self.aux_key_items[file_type][content_subtype][lp_category] data_items = self.aux_data_items[file_type][content_subtype][lp_category] - has_bool_key = False + has_bool_key = has_bool_data = False if key_items is not None: has_bool_key = next((k['type'] == 'bool' for k in key_items if k['type'] == 'bool'), False) - has_bool_data = False - if data_items is not None: has_bool_data = next((d['type'] == 'bool' for d in data_items if d['type'] == 'bool'), False) diff --git a/wwpdb/utils/tests-nmr/antlr-grammars-v4.10/NmrPipePKLexer.g4 b/wwpdb/utils/tests-nmr/antlr-grammars-v4.10/NmrPipePKLexer.g4 new file mode 100644 index 00000000..f4033130 --- /dev/null +++ b/wwpdb/utils/tests-nmr/antlr-grammars-v4.10/NmrPipePKLexer.g4 @@ -0,0 +1,167 @@ +/* + NmrPipe PK (Spectral peak list) lexer grammar for ANTLR v4. + Copyright 2024 Masashi Yokochi + +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +lexer grammar NmrPipePKLexer; + +/* NmrPipe: Syntax + See also https://spin.niddk.nih.gov/NMRPipe/ +*/ + +Data: 'DATA' -> pushMode(DATA_MODE); + +Vars: 'VARS' -> pushMode(VARS_MODE); + +Format: 'FORMAT' -> pushMode(FORMAT_MODE); + +Null_value: 'NULLVALUE' -> pushMode(NULL_VALUE_MODE); +Null_string: 'NULLSTRING' -> pushMode(NULL_STRING_MODE); + +Integer: ('+' | '-')? DECIMAL; +Float: ('+' | '-')? (DECIMAL | DEC_DOT_DEC); +Real: ('+' | '-')? (DECIMAL | DEC_DOT_DEC) ([Ee] ('+' | '-')? DECIMAL)?; +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); + +Simple_name: SIMPLE_NAME; +//Residue_number: Integer; +//Residue_name: SIMPLE_NAME; +//Atom_name: ALPHA_NUM ATM_NAME_CHAR*; + +fragment ALPHA: [A-Za-z]; +fragment ALPHA_NUM: ALPHA | DEC_DIGIT; +fragment START_CHAR: ALPHA_NUM | '_' | '-' | '+' | '.' | '*' | '#' | '?'; +fragment NAME_CHAR: START_CHAR | '\'' | '"'; +//fragment ATM_NAME_CHAR: ALPHA_NUM | '\''; +fragment SIMPLE_NAME: START_CHAR NAME_CHAR*; + +SPACE: [ \t\r\n]+ -> skip; +ENCLOSE_COMMENT: '{' (ENCLOSE_COMMENT | .)*? '}' -> channel(HIDDEN); +SECTION_COMMENT: ('#' | '!' | ';' | '\\' | '&' | '/' '/'+ | '*' '*'+ | '-' '-'+ | '+' '+'+ | '=' '='+ | 'REMARK') ' '* [\r\n]+ -> channel(HIDDEN); +LINE_COMMENT: ('#' | '!' | ';' | '\\' | '&' | '/' '/'+ | '*' '*'+ | '-' '-'+ | '+' '+'+ | '=' '='+ | 'REMARK') ~[\r\n]* -> channel(HIDDEN); + +mode DATA_MODE; + +X_axis_DA: 'X_AXIS'; +Y_axis_DA: 'Y_AXIS'; +Z_axis_DA: 'Z_AXIS'; +A_axis_DA: 'A_AXIS'; + +Ppm_value_DA: Float 'ppm'; + +Integer_DA: ('+' | '-')? DECIMAL; +Float_DA: ('+' | '-')? (DECIMAL | DEC_DOT_DEC); +Real_DA: ('+' | '-')? (DECIMAL | DEC_DOT_DEC) ([Ee] ('+' | '-')? DECIMAL)?; + +Simple_name_DA: SIMPLE_NAME; + +SPACE_DA: [ \t]+ -> skip; +RETURN_DA: [\r\n]+ -> popMode; + +//SECTION_COMMENT_DA: ('#' | '!' | ';' | '\\' | '&' | '/' '/'+ | '*' '*'+ | '-' '-'+ | '+' '+'+ | '=' '='+ | 'REMARK') ' '* [\r\n]+ -> channel(HIDDEN); +LINE_COMMENT_DA: ('#' | '!' | ';' | '\\' | '&' | '/' '/'+ | '*' '*'+ | '-' '-'+ | '+' '+'+ | '=' '='+ | 'REMARK') ~[\r\n]* -> channel(HIDDEN); + +mode VARS_MODE; + +Index: 'INDEX'; +X_axis: 'X_AXIS'; +Y_axis: 'Y_AXIS'; +Z_axis: 'Z_AXIS'; +A_axis: 'A_AXIS'; + +Dx: 'DX'; +Dy: 'DY'; +Dz: 'DZ'; +Da: 'DA'; + +X_ppm: 'X_PPM'; +Y_ppm: 'Y_PPM'; +Z_ppm: 'Z_PPM'; +A_ppm: 'A_PPM'; + +X_hz: 'X_HZ'; +Y_hz: 'Y_HZ'; +Z_hz: 'Z_HZ'; +A_hz: 'A_HZ'; + +Xw: 'XW'; +Yw: 'YW'; +Zw: 'ZW'; +Aw: 'AW'; + +Xw_hz: 'XW_HZ'; +Yw_hz: 'YW_HZ'; +Zw_hz: 'ZW_HZ'; +Aw_hz: 'AW_HZ'; + +X1: 'X1'; +X3: 'X3'; +Y1: 'Y1'; +Y3: 'Y3'; +Z1: 'Z1'; +Z3: 'Z3'; +A1: 'A1'; +A3: 'A3'; + +Height: 'HEIGHT'; +DHeight: 'DHEIGHT'; +Vol: 'VOL'; +Pchi2: 'PCHI2'; +Type: 'TYPE'; +Ass: 'ASS'; +ClustId: 'CLUSTID'; +Memcnt: 'MEMCNT'; + +Integer_VA: ('+' | '-')? DECIMAL; +Float_VA: ('+' | '-')? (DECIMAL | DEC_DOT_DEC); +Real_VA: ('+' | '-')? (DECIMAL | DEC_DOT_DEC) ([Ee] ('+' | '-')? DECIMAL)?; + +Simple_name_VA: SIMPLE_NAME; + +SPACE_VA: [ \t]+ -> skip; +RETURN_VA: [\r\n]+ -> popMode; + +//SECTION_COMMENT_VA: ('#' | '!' | ';' | '\\' | '&' | '/' '/'+ | '*' '*'+ | '-' '-'+ | '+' '+'+ | '=' '='+ | 'REMARK') ' '* [\r\n]+ -> channel(HIDDEN); +LINE_COMMENT_VA: ('#' | '!' | ';' | '\\' | '&' | '/' '/'+ | '*' '*'+ | '-' '-'+ | '+' '+'+ | '=' '='+ | 'REMARK') ~[\r\n]* -> channel(HIDDEN); + +mode FORMAT_MODE; + +Format_code: '%' DECIMAL? ('s' | 'd' | '.' DECIMAL 'f' | '+'? 'e'); + +SPACE_FO: [ \t]+ -> skip; +RETURN_FO: [\r\n]+ -> popMode; + +//SECTION_COMMENT_FO: ('#' | '!' | ';' | '\\' | '&' | '/' '/'+ | '*' '*'+ | '-' '-'+ | '+' '+'+ | '=' '='+ | 'REMARK') ' '* [\r\n]+ -> channel(HIDDEN); +LINE_COMMENT_FO: ('#' | '!' | ';' | '\\' | '&' | '/' '/'+ | '*' '*'+ | '-' '-'+ | '+' '+'+ | '=' '='+ | 'REMARK') ~[\r\n]* -> channel(HIDDEN); + +mode NULL_VALUE_MODE; + +Any_name_NV: ~[ \t\r\n]+; + +SPACE_NV: [ \t]+ -> skip; +RETURN_NV: [\r\n]+ -> popMode; + +mode NULL_STRING_MODE; + +Any_name_NS: ~[ \t\r\n]+; + +SPACE_NS: [ \t]+ -> skip; +RETURN_NS: [\r\n]+ -> popMode; + diff --git a/wwpdb/utils/tests-nmr/antlr-grammars-v4.10/NmrPipePKParser.g4 b/wwpdb/utils/tests-nmr/antlr-grammars-v4.10/NmrPipePKParser.g4 new file mode 100644 index 00000000..6ed65ecd --- /dev/null +++ b/wwpdb/utils/tests-nmr/antlr-grammars-v4.10/NmrPipePKParser.g4 @@ -0,0 +1,161 @@ +/* + NmrPipe PK (Spectral peak list) parser grammar for ANTLR v4. + Copyright 2024 Masashi Yokochi + +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +parser grammar NmrPipePKParser; + +options { tokenVocab=NmrPipePKLexer; } + +nmrpipe_pk: + ( + data_label | + peak_list_2d | + peak_list_3d | + peak_list_4d + )* + EOF; + +/* NmrPipe: Syntax + See also https://spin.niddk.nih.gov/NMRPipe/ +*/ + +data_label: + Data (X_axis_DA | Y_axis_DA | Z_axis_DA | A_axis_DA) + Simple_name_DA Integer_DA Integer_DA + Ppm_value_DA Ppm_value_DA RETURN_DA; + +peak_list_2d: + Vars + Index + X_axis Y_axis + Dx Dy + X_ppm Y_ppm + X_hz Y_hz + Xw Yw + Xw_hz Yw_hz + X1 X3 Y1 Y3 + Height DHeight Vol + Pchi2 Type Ass + ClustId Memcnt RETURN_VA + Format Format_code + Format_code Format_code + Format_code Format_code + Format_code Format_code + Format_code Format_code + Format_code Format_code + Format_code Format_code + Format_code Format_code Format_code Format_code + Format_code Format_code Format_code + Format_code Format_code RETURN_FO + (Null_value Any_name_NV RETURN_NV)? + (Null_string Any_name_NS RETURN_NS)? + peak_2d+; + +peak_2d: + Integer + number number + number number + number number + number number + number number + number number + number number number number + number number number + number Integer Simple_name + Integer Integer; + +peak_list_3d: + Vars + Index + X_axis Y_axis Z_axis + Dx Dy Dz + X_ppm Y_ppm Z_ppm + X_hz Y_hz Z_hz + Xw Yw Zw + Xw_hz Yw_hz Zw_hz + X1 X3 Y1 Y3 Z1 Z3 + Height DHeight Vol + Pchi2 Type Ass + ClustId Memcnt RETURN_VA + Format Format_code + Format_code Format_code Format_code + Format_code Format_code Format_code + Format_code Format_code Format_code + Format_code Format_code Format_code + Format_code Format_code Format_code + Format_code Format_code Format_code + Format_code Format_code Format_code Format_code Format_code Format_code + Format_code Format_code Format_code + Format_code Format_code RETURN_FO + (Null_value Any_name_NV RETURN_NV)? + (Null_string Any_name_NS RETURN_NS)? + peak_3d+; + +peak_3d: + Integer + number number number + number number number + number number number + number number number + number number number + number number number + number number number number number number + number number number + number Integer Simple_name + Integer Integer; + +peak_list_4d: + Vars + Index + X_axis Y_axis Z_axis A_axis + Dx Dy Dz Dz + X_ppm Y_ppm Z_ppm A_ppm + X_hz Y_hz Z_hz A_hz + Xw Yw Zw Aw + Xw_hz Yw_hz Zw_hz Aw_hz + X1 X3 Y1 Y3 Z1 Z3 A1 A3 + Height DHeight Vol + Pchi2 Type Ass + ClustId Memcnt RETURN_VA + Format Format_code + Format_code Format_code Format_code Format_code + Format_code Format_code Format_code Format_code + Format_code Format_code Format_code Format_code + Format_code Format_code Format_code Format_code + Format_code Format_code Format_code Format_code + Format_code Format_code Format_code Format_code + Format_code Format_code Format_code Format_code Format_code Format_code Format_code Format_code + Format_code Format_code Format_code + Format_code Format_code RETURN_FO + (Null_value Any_name_NV RETURN_NV)? + (Null_string Any_name_NS RETURN_NS)? + peak_4d+; + +peak_4d: + Integer + number number number number + number number number number + number number number number + number number number number + number number number number + number number number number + number number number number number number number number + number number number + number Integer Simple_name + Integer Integer; + +/* number expression in peak list */ +number: Float | Real | Integer | Simple_name; + diff --git a/wwpdb/utils/tests-nmr/antlr-grammars-v4.10/NmrViewPKLexer.g4 b/wwpdb/utils/tests-nmr/antlr-grammars-v4.10/NmrViewPKLexer.g4 new file mode 100644 index 00000000..c5d82873 --- /dev/null +++ b/wwpdb/utils/tests-nmr/antlr-grammars-v4.10/NmrViewPKLexer.g4 @@ -0,0 +1,74 @@ +/* + NmrView PK (Spectral peak list) lexer grammar for ANTLR v4. + Copyright 2024 Masashi Yokochi + +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +lexer grammar NmrViewPKLexer; + +Label: 'label' -> pushMode(LABEL_MODE); + +Integer: ('+' | '-')? DECIMAL; +Float: ('+' | '-')? (DECIMAL | DEC_DOT_DEC); +Real: ('+' | '-')? (DECIMAL | DEC_DOT_DEC) ([Ee] ('+' | '-')? DECIMAL)?; +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); + +Simple_name: SIMPLE_NAME; +//Residue_number: Integer; +//Residue_name: SIMPLE_NAME; +//Atom_name: ALPHA_NUM ATM_NAME_CHAR*; + +fragment ALPHA: [A-Za-z]; +fragment ALPHA_NUM: ALPHA | DEC_DIGIT; +fragment START_CHAR: ALPHA_NUM | '_' | '-' | '+' | '.' | '*' | '#' | '?'; +fragment NAME_CHAR: START_CHAR | '\'' | '"'; +//fragment ATM_NAME_CHAR: ALPHA_NUM | '\''; +fragment SIMPLE_NAME: START_CHAR NAME_CHAR*; + +SPACE: [ \t\r\n]+ -> skip; +ENCLOSE_COMMENT: '{' (Float | SIMPLE_NAME)*? '}'; +SECTION_COMMENT: ('#' | '!' | ';' | '\\' | '&' | '/' '/'+ | '*' '*'+ | '-' '-'+ | '+' '+'+ | '=' '='+ | 'REMARK') ' '* [\r\n]+ -> channel(HIDDEN); +LINE_COMMENT: ('#' | '!' | ';' | '\\' | '&' | '/' '/'+ | '*' '*'+ | '-' '-'+ | '+' '+'+ | '=' '='+ | 'REMARK') ~[\r\n]* -> channel(HIDDEN); + +mode LABEL_MODE; + +Dataset: 'dataset'; +Sw: 'sw'; +Sf: 'sf'; + +L_name: Simple_name '.L'; +P_name: Simple_name '.P'; +W_name: Simple_name '.W'; +B_name: Simple_name '.B'; +E_name: Simple_name '.E'; +J_name: Simple_name '.J'; +U_name: Simple_name ',U'; + +Vol: 'vol'; +Int: 'int'; +Stat: 'stat'; +Comment: 'comment'; +Flag0: 'flag0' [\r\n]+ -> popMode; + +Simple_name_LA: SIMPLE_NAME; +Float_LA: Float; + +SPACE_LA: [ \t]+ -> skip; +RETURN_LA: [\r\n]+; + diff --git a/wwpdb/utils/tests-nmr/antlr-grammars-v4.10/NmrViewPKParser.g4 b/wwpdb/utils/tests-nmr/antlr-grammars-v4.10/NmrViewPKParser.g4 new file mode 100644 index 00000000..78d4d415 --- /dev/null +++ b/wwpdb/utils/tests-nmr/antlr-grammars-v4.10/NmrViewPKParser.g4 @@ -0,0 +1,74 @@ +/* + NmrView PK (Spectral peak list) parser grammar for ANTLR v4. + Copyright 2024 Masashi Yokochi + +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +parser grammar NmrViewPKParser; + +options { tokenVocab=NmrViewPKLexer; } + +nmrview_pk: + ( + data_label | + peak_list_2d | + peak_list_3d | + peak_list_4d + )* + EOF; + +data_label: + Label Dataset Sw Sf RETURN_LA + labels RETURN_LA + Simple_name_LA RETURN_LA + widths RETURN_LA + freqs RETURN_LA + vars; + +labels: + Simple_name_LA+; + +widths: + Float_LA+; + +freqs: + Float_LA+; + +vars: + vars_per_axis+ + Vol Int Stat Comment Flag0; + +vars_per_axis: + L_name P_name W_name B_name E_name J_name U_name; + +peak_list_2d: + Integer + ENCLOSE_COMMENT Float Float Float Simple_name ENCLOSE_COMMENT ENCLOSE_COMMENT + ENCLOSE_COMMENT Float Float Float Simple_name ENCLOSE_COMMENT ENCLOSE_COMMENT + Float Float Integer ENCLOSE_COMMENT Integer; + +peak_list_3d: + Integer + ENCLOSE_COMMENT Float Float Float Simple_name ENCLOSE_COMMENT ENCLOSE_COMMENT + ENCLOSE_COMMENT Float Float Float Simple_name ENCLOSE_COMMENT ENCLOSE_COMMENT + ENCLOSE_COMMENT Float Float Float Simple_name ENCLOSE_COMMENT ENCLOSE_COMMENT + Float Float Integer ENCLOSE_COMMENT Integer; + +peak_list_4d: + Integer + ENCLOSE_COMMENT Float Float Float Simple_name ENCLOSE_COMMENT ENCLOSE_COMMENT + ENCLOSE_COMMENT Float Float Float Simple_name ENCLOSE_COMMENT ENCLOSE_COMMENT + ENCLOSE_COMMENT Float Float Float Simple_name ENCLOSE_COMMENT ENCLOSE_COMMENT + ENCLOSE_COMMENT Float Float Float Simple_name ENCLOSE_COMMENT ENCLOSE_COMMENT + Float Float Integer ENCLOSE_COMMENT Integer; + diff --git a/wwpdb/utils/tests-nmr/antlr-grammars-v4.10/SparkyPKLexer.g4 b/wwpdb/utils/tests-nmr/antlr-grammars-v4.10/SparkyPKLexer.g4 new file mode 100644 index 00000000..e50cf64a --- /dev/null +++ b/wwpdb/utils/tests-nmr/antlr-grammars-v4.10/SparkyPKLexer.g4 @@ -0,0 +1,68 @@ +/* + Sparky PK (Spectral peak list) lexer grammar for ANTLR v4. + Copyright 2024 Masashi Yokochi + +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +lexer grammar SparkyPKLexer; + +Assignment: 'Assignment' -> pushMode(LABEL_MODE); +W1: 'w1' -> pushMode(LABEL_MODE); + +Integer: ('+' | '-')? DECIMAL; +Float: ('+' | '-')? (DECIMAL | DEC_DOT_DEC); +Real: ('+' | '-')? (DECIMAL | DEC_DOT_DEC) ([Ee] ('+' | '-')? DECIMAL)?; +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); + +Assignment_2d_ex: SIMPLE_NAME '-' SIMPLE_NAME; +Assignment_3d_ex: SIMPLE_NAME '-' SIMPLE_NAME '-' SIMPLE_NAME; +Assignment_4d_ex: SIMPLE_NAME '-' SIMPLE_NAME '-' SIMPLE_NAME '-' SIMPLE_NAME; + +Simple_name: SIMPLE_NAME; +//Residue_number: Integer; +//Residue_name: SIMPLE_NAME; +//Atom_name: ALPHA_NUM ATM_NAME_CHAR*; + +fragment ALPHA: [A-Za-z]; +fragment ALPHA_NUM: ALPHA | DEC_DIGIT; +fragment START_CHAR: ALPHA_NUM | '_' | '-' | '+' | '.' | '*' | '#' | '?'; +fragment NAME_CHAR: START_CHAR | '\'' | '"'; +//fragment ATM_NAME_CHAR: ALPHA_NUM | '\''; +fragment SIMPLE_NAME: START_CHAR NAME_CHAR*; + +SPACE: [ \t]+ -> skip; +RETURN: [\r\n]+; +ENCLOSE_COMMENT: '{' (Float | SIMPLE_NAME)*? '}'; +SECTION_COMMENT: ('#' | '!' | ';' | '\\' | '&' | '/' '/'+ | '*' '*'+ | '-' '-'+ | '+' '+'+ | '=' '='+ | 'REMARK') ' '* [\r\n]+ -> channel(HIDDEN); +LINE_COMMENT: ('#' | '!' | ';' | '\\' | '&' | '/' '/'+ | '*' '*'+ | '-' '-'+ | '+' '+'+ | '=' '='+ | 'REMARK') ~[\r\n]* -> channel(HIDDEN); + +mode LABEL_MODE; + +W1_LA: 'w1'; +W2_LA: 'w2'; +W3_LA: 'w3'; +W4_LA: 'w4'; + +Height_LA: 'Data '? 'Height'; +Volume_LA: 'Volume'; +S_N_LA: 'S/N'; + +SPACE_LA: [ \t]+ -> skip; +RETURN_LA: [\r\n]+ -> popMode; + diff --git a/wwpdb/utils/tests-nmr/antlr-grammars-v4.10/SparkyPKParser.g4 b/wwpdb/utils/tests-nmr/antlr-grammars-v4.10/SparkyPKParser.g4 new file mode 100644 index 00000000..13db87ed --- /dev/null +++ b/wwpdb/utils/tests-nmr/antlr-grammars-v4.10/SparkyPKParser.g4 @@ -0,0 +1,50 @@ +/* + Sparky PK (Spectral peak list) parser grammar for ANTLR v4. + Copyright 2024 Masashi Yokochi + +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +parser grammar SparkyPKParser; + +options { tokenVocab=SparkyPKLexer; } + +sparky_pk: + ( + data_label | + data_label_wo_assign + )* + EOF; + +data_label: + Assignment W1_LA W2_LA W3_LA? W4_LA? Height_LA Volume_LA? S_N_LA? RETURN_LA + (peak_2d+ | peak_3d+ | peak_4d+); + +data_label_wo_assign: + W1 W2_LA W3_LA? W4_LA? Height_LA Volume_LA? S_N_LA? RETURN_LA + peak_wo_assign+; + +peak_2d: + Assignment_2d_ex Float Float number+ RETURN; + +peak_3d: + Assignment_3d_ex Float Float Float number+ RETURN; + +peak_4d: + Assignment_4d_ex Float Float Float Float number+ RETURN; + +peak_wo_assign: + number+ RETURN; + +/* number expression in assign */ +number: Real | Float | Integer; + diff --git a/wwpdb/utils/tests-nmr/antlr-grammars-v4.10/XeasyPKLexer.g4 b/wwpdb/utils/tests-nmr/antlr-grammars-v4.10/XeasyPKLexer.g4 new file mode 100644 index 00000000..b4081ae7 --- /dev/null +++ b/wwpdb/utils/tests-nmr/antlr-grammars-v4.10/XeasyPKLexer.g4 @@ -0,0 +1,101 @@ +/* + Xeasy PK (Spectral peak list) lexer grammar for ANTLR v4. + Copyright 2024 Masashi Yokochi + +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +lexer grammar XeasyPKLexer; + +Num_of_dim: '#' ~[\t\r\n]* 'Number of dimensions' -> pushMode(NUM_OF_DIM_MODE); + +Format: '#FORMAT' -> pushMode(FORMAT_MODE); + +Iname: '#INAME' -> pushMode(INAME_MODE); + +Cyana_format: '#CYANAFORMAT' -> pushMode(CYANA_FORMAT_MODE); + +Spectrum: '#SPECTRUM' -> pushMode(SPECTRUM_MODE); + +Tolerance: '#TOLERANCE' -> pushMode(TOLERANCE_MODE); + +Integer: ('+' | '-')? DECIMAL; +Float: ('+' | '-')? (DECIMAL | DEC_DOT_DEC); +Real: ('+' | '-')? (DECIMAL | DEC_DOT_DEC) ([Ee] ('+' | '-')? DECIMAL)?; +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); + +Simple_name: SIMPLE_NAME; +//Residue_number: Integer; +//Residue_name: SIMPLE_NAME; +//Atom_name: ALPHA_NUM ATM_NAME_CHAR*; + +fragment ALPHA: [A-Za-z]; +fragment ALPHA_NUM: ALPHA | DEC_DIGIT; +fragment START_CHAR: ALPHA_NUM | '_' | '-' | '+' | '.' | '*' | '#' | '?'; +fragment NAME_CHAR: START_CHAR | '\'' | '"'; +//fragment ATM_NAME_CHAR: ALPHA_NUM | '\''; +fragment SIMPLE_NAME: START_CHAR NAME_CHAR*; + +SPACE: [ \t\r\n]+ -> skip; +ENCLOSE_COMMENT: '{' (ENCLOSE_COMMENT | .)*? '}' -> channel(HIDDEN); +SECTION_COMMENT: ('#' | '!' | ';' | '\\' | '&' | '/' '/'+ | '*' '*'+ | '-' '-'+ | '+' '+'+ | '=' '='+ | 'REMARK') ' '* [\r\n]+ -> channel(HIDDEN); +LINE_COMMENT: ('#' | '!' | ';' | '\\' | '&' | '/' '/'+ | '*' '*'+ | '-' '-'+ | '+' '+'+ | '=' '='+ | 'REMARK') ~[\r\n]* -> channel(HIDDEN); + +mode NUM_OF_DIM_MODE; + +Integer_ND: ('+' | '-')? DECIMAL; + +SPACE_ND: [ \t]+ -> skip; +RETURN_ND: [\r\n]+ -> popMode; + +mode FORMAT_MODE; + +Simple_name_FO: SIMPLE_NAME; + +SPACE_FO: [ \t]+ -> skip; +RETURN_FO: [\r\n]+ -> popMode; + +mode INAME_MODE; + +Integer_IN: ('+' | '-')? DECIMAL; +Simple_name_IN: SIMPLE_NAME; + +SPACE_IN: [ \t]+ -> skip; +RETURN_IN: [\r\n]+ -> popMode; + +mode CYANA_FORMAT_MODE; + +Simple_name_CY: SIMPLE_NAME; + +SPACE_CY: [ \t]+ -> skip; +RETURN_CY: [\r\n]+ -> popMode; + +mode SPECTRUM_MODE; + +Simple_name_SP: SIMPLE_NAME; + +SPACE_SP: [ \t]+ -> skip; +RETURN_SP: [\r\n]+ -> popMode; + +mode TOLERANCE_MODE; + +Float_TO: Float; + +TOACE_TO: [ \t]+ -> skip; +RETURN_TO: [\r\n]+ -> popMode; + diff --git a/wwpdb/utils/tests-nmr/antlr-grammars-v4.10/XeasyPKParser.g4 b/wwpdb/utils/tests-nmr/antlr-grammars-v4.10/XeasyPKParser.g4 new file mode 100644 index 00000000..ac6f2233 --- /dev/null +++ b/wwpdb/utils/tests-nmr/antlr-grammars-v4.10/XeasyPKParser.g4 @@ -0,0 +1,87 @@ +/* + Xeasy PK (Spectral peak list) parser grammar for ANTLR v4. + Copyright 2024 Masashi Yokochi + +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +parser grammar XeasyPKParser; + +options { tokenVocab=XeasyPKLexer; } + +xeasy_pk: + ( + dimension | + iname | + cyana_format | + spectrum | + tolerance | + peak_list_2d | + peak_list_3d | + peak_list_4d + )* + EOF; + +dimension: + Num_of_dim Integer_ND RETURN_ND; + +iname: + Iname Integer_IN Simple_name_IN RETURN_IN; + +cyana_format: + Cyana_format Simple_name_CY RETURN_CY; + +spectrum: + Spectrum Simple_name_SP+ RETURN_SP; + +tolerance: + Tolerance Float_TO+ RETURN_TO; + +peak_list_2d: + peak_2d+; + +peak_2d: + Integer + Float Float + Integer Simple_name + number number + Simple_name + assign assign; + +peak_list_3d: + peak_3d+; + +peak_3d: + Integer + Float Float Float + Integer Simple_name + number number + Simple_name + assign assign assign; + +peak_list_4d: + peak_4d+; + +peak_4d: + Integer + Float Float Float Float + Integer Simple_name + number number + Simple_name + 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?; + diff --git a/wwpdb/utils/tests-nmr/antlr-grammars-v4.9/NmrPipePKLexer.g4 b/wwpdb/utils/tests-nmr/antlr-grammars-v4.9/NmrPipePKLexer.g4 new file mode 120000 index 00000000..8ce405a6 --- /dev/null +++ b/wwpdb/utils/tests-nmr/antlr-grammars-v4.9/NmrPipePKLexer.g4 @@ -0,0 +1 @@ +../antlr-grammars-v4.10/NmrPipePKLexer.g4 \ No newline at end of file diff --git a/wwpdb/utils/tests-nmr/antlr-grammars-v4.9/NmrPipePKParser.g4 b/wwpdb/utils/tests-nmr/antlr-grammars-v4.9/NmrPipePKParser.g4 new file mode 120000 index 00000000..bd64ae77 --- /dev/null +++ b/wwpdb/utils/tests-nmr/antlr-grammars-v4.9/NmrPipePKParser.g4 @@ -0,0 +1 @@ +../antlr-grammars-v4.10/NmrPipePKParser.g4 \ No newline at end of file diff --git a/wwpdb/utils/tests-nmr/antlr-grammars-v4.9/NmrViewPKLexer.g4 b/wwpdb/utils/tests-nmr/antlr-grammars-v4.9/NmrViewPKLexer.g4 new file mode 120000 index 00000000..563aef36 --- /dev/null +++ b/wwpdb/utils/tests-nmr/antlr-grammars-v4.9/NmrViewPKLexer.g4 @@ -0,0 +1 @@ +../antlr-grammars-v4.10/NmrViewPKLexer.g4 \ No newline at end of file diff --git a/wwpdb/utils/tests-nmr/antlr-grammars-v4.9/NmrViewPKParser.g4 b/wwpdb/utils/tests-nmr/antlr-grammars-v4.9/NmrViewPKParser.g4 new file mode 120000 index 00000000..5f9a9b12 --- /dev/null +++ b/wwpdb/utils/tests-nmr/antlr-grammars-v4.9/NmrViewPKParser.g4 @@ -0,0 +1 @@ +../antlr-grammars-v4.10/NmrViewPKParser.g4 \ No newline at end of file diff --git a/wwpdb/utils/tests-nmr/antlr-grammars-v4.9/SparkyPKLexer.g4 b/wwpdb/utils/tests-nmr/antlr-grammars-v4.9/SparkyPKLexer.g4 new file mode 120000 index 00000000..7262300f --- /dev/null +++ b/wwpdb/utils/tests-nmr/antlr-grammars-v4.9/SparkyPKLexer.g4 @@ -0,0 +1 @@ +../antlr-grammars-v4.10/SparkyPKLexer.g4 \ No newline at end of file diff --git a/wwpdb/utils/tests-nmr/antlr-grammars-v4.9/SparkyPKParser.g4 b/wwpdb/utils/tests-nmr/antlr-grammars-v4.9/SparkyPKParser.g4 new file mode 120000 index 00000000..9e80b487 --- /dev/null +++ b/wwpdb/utils/tests-nmr/antlr-grammars-v4.9/SparkyPKParser.g4 @@ -0,0 +1 @@ +../antlr-grammars-v4.10/SparkyPKParser.g4 \ No newline at end of file diff --git a/wwpdb/utils/tests-nmr/antlr-grammars-v4.9/XeasyPKLexer.g4 b/wwpdb/utils/tests-nmr/antlr-grammars-v4.9/XeasyPKLexer.g4 new file mode 120000 index 00000000..4c3adf6d --- /dev/null +++ b/wwpdb/utils/tests-nmr/antlr-grammars-v4.9/XeasyPKLexer.g4 @@ -0,0 +1 @@ +../antlr-grammars-v4.10/XeasyPKLexer.g4 \ No newline at end of file diff --git a/wwpdb/utils/tests-nmr/antlr-grammars-v4.9/XeasyPKParser.g4 b/wwpdb/utils/tests-nmr/antlr-grammars-v4.9/XeasyPKParser.g4 new file mode 120000 index 00000000..e5797ae1 --- /dev/null +++ b/wwpdb/utils/tests-nmr/antlr-grammars-v4.9/XeasyPKParser.g4 @@ -0,0 +1 @@ +../antlr-grammars-v4.10/XeasyPKParser.g4 \ No newline at end of file diff --git a/wwpdb/utils/tests-nmr/json-schema/nmr-data-procesing-report-schema-v4.json b/wwpdb/utils/tests-nmr/json-schema/nmr-data-procesing-report-schema-v4.json index 55418e82..6dbc866c 100644 --- a/wwpdb/utils/tests-nmr/json-schema/nmr-data-procesing-report-schema-v4.json +++ b/wwpdb/utils/tests-nmr/json-schema/nmr-data-procesing-report-schema-v4.json @@ -39,12 +39,14 @@ "nm-res-syb", "nm-res-xpl", "nm-pea-any", + "nm-pea-ari", "nm-pea-ccp", "nm-pea-pip", "nm-pea-spa", "nm-pea-top", "nm-pea-vie", - "nm-pea-xea" + "nm-pea-xea", + "nm-pea-xwi" ] }, "original_file_name": {