diff --git a/ChildProject/annotations.py b/ChildProject/annotations.py index 28e7481bf..f3610f647 100644 --- a/ChildProject/annotations.py +++ b/ChildProject/annotations.py @@ -35,6 +35,7 @@ class AnnotationManager: IndexColumn(name = 'filter', description = 'source file to filter in (for rttm and alice only)', required = False), IndexColumn(name = 'annotation_filename', description = 'output formatted annotation location, relative to `annotations//converted (automatic column, don\'t specify)', filename = True, required = False, generated = True), IndexColumn(name = 'imported_at', description = 'importation date (automatic column, don\'t specify)', datetime = "%Y-%m-%d %H:%M:%S", required = False, generated = True), + IndexColumn(name = 'type', description = 'annotation storage format', choices = ['csv', 'gz', 'h5'], required = False), IndexColumn(name = 'package_version', description = 'version of the package used when the importation was performed', regex = r"[0-9]+\.[0-9]+\.[0-9]+", required = False, generated = True), IndexColumn(name = 'error', description = 'error message in case the annotation could not be imported', required = False, generated = True) ] @@ -44,22 +45,22 @@ class AnnotationManager: IndexColumn(name = 'segment_onset', description = 'segment onset timestamp in milliseconds (since the start of the recording)', regex = r"([0-9]+)", required = True), IndexColumn(name = 'segment_offset', description = 'segment end time in milliseconds (since the start of the recording)', regex = r"([0-9]+)", required = True), IndexColumn(name = 'speaker_id', description = 'identity of speaker in the annotation'), - IndexColumn(name = 'speaker_type', description = 'class of speaker (FEM = female adult, MAL = male adult, CHI = key child, OCH = other child)', choices = ['FEM', 'MAL', 'CHI', 'OCH', 'NA']), - IndexColumn(name = 'ling_type', description = '1 if the vocalization contains at least a vowel (ie canonical or non-canonical), 0 if crying or laughing', choices = ['1', '0', 'NA']), - IndexColumn(name = 'vcm_type', description = 'vocal maturity defined as: C (canonical), N (non-canonical), Y (crying) L (laughing), J (junk)', choices = ['C', 'N', 'Y', 'L', 'J', 'NA']), - IndexColumn(name = 'lex_type', description = 'W if meaningful, 0 otherwise', choices = ['W', '0', 'NA']), - IndexColumn(name = 'mwu_type', description = 'M if multiword, 1 if single word -- only filled if lex_type==W', choices = ['M', '1', 'NA']), - IndexColumn(name = 'addressee', description = 'T if target-child-directed, C if other-child-directed, A if adult-directed, U if uncertain or other. Multiple values should be sorted and separated by commas', choices = ['T', 'C', 'A', 'U', 'NA']), + IndexColumn(name = 'speaker_type', description = 'class of speaker (FEM = female adult, MAL = male adult, CHI = key child, OCH = other child)', choices = ['FEM', 'MAL', 'CHI', 'OCH', 'NA'], na = True), + IndexColumn(name = 'ling_type', description = '1 if the vocalization contains at least a vowel (ie canonical or non-canonical), 0 if crying or laughing', choices = ['1', '0', 'NA'], na = True), + IndexColumn(name = 'vcm_type', description = 'vocal maturity defined as: C (canonical), N (non-canonical), Y (crying) L (laughing), J (junk)', choices = ['C', 'N', 'Y', 'L', 'J', 'NA'], na = True), + IndexColumn(name = 'lex_type', description = 'W if meaningful, 0 otherwise', choices = ['W', '0', 'NA'], na = True), + IndexColumn(name = 'mwu_type', description = 'M if multiword, 1 if single word -- only filled if lex_type==W', choices = ['M', '1', 'NA'], na = True), + IndexColumn(name = 'addressee', description = 'T if target-child-directed, C if other-child-directed, A if adult-directed, U if uncertain or other. Multiple values should be sorted and separated by commas', choices = ['T', 'C', 'A', 'U', 'NA'], na = True), IndexColumn(name = 'transcription', description = 'orthographic transcription of the speach'), IndexColumn(name = 'phonemes', description = 'amount of phonemes', regex = r'(\d+(\.\d+)?)'), IndexColumn(name = 'syllables', description = 'amount of syllables', regex = r'(\d+(\.\d+)?)'), - IndexColumn(name = 'words', description = 'amount of words', regex = r'(\d+(\.\d+)?)'), - IndexColumn(name = 'lena_block_type', description = 'whether regarded as part as a pause or a conversation by LENA', choices = ['pause', 'CM', 'CIC', 'CIOCX', 'CIOCAX', 'AMF', 'AICF', 'AIOCF', 'AIOCCXF', 'AMM', 'AICM', 'AIOCM', 'AIOCCXM', 'XM', 'XIOCC', 'XIOCA', 'XIC', 'XIOCAC']), - IndexColumn(name = 'lena_block_number', description = 'number of the LENA pause/conversation the segment belongs to', regex = r"(\d+(\.\d+)?)"), - IndexColumn(name = 'lena_conv_status', description = 'LENA conversation status', choices = ['BC', 'RC', 'EC']), - IndexColumn(name = 'lena_response_count', description = 'LENA turn count within block', regex = r"(\d+(\.\d+)?)"), - IndexColumn(name = 'lena_conv_floor_type', description = '(FI): Floor Initiation, (FH): Floor Holding', choices = ['FI', 'FH']), - IndexColumn(name = 'lena_conv_turn_type', description = 'LENA turn type', choices = ['TIFI', 'TIMI', 'TIFR', 'TIMR', 'TIFE', 'TIME', 'NT']), + IndexColumn(name = 'words', description = 'amount of words', regex = r'(\d+(\.\d+)?)', na = True), + IndexColumn(name = 'lena_block_type', description = 'whether regarded as part as a pause or a conversation by LENA', choices = ['pause', 'CM', 'CIC', 'CIOCX', 'CIOCAX', 'AMF', 'AICF', 'AIOCF', 'AIOCCXF', 'AMM', 'AICM', 'AIOCM', 'AIOCCXM', 'XM', 'XIOCC', 'XIOCA', 'XIC', 'XIOCAC'], na = True), + IndexColumn(name = 'lena_block_number', description = 'number of the LENA pause/conversation the segment belongs to', regex = r"(\d+(\.\d+)?)", na = True), + IndexColumn(name = 'lena_conv_status', description = 'LENA conversation status', choices = ['BC', 'RC', 'EC'], na = True), + IndexColumn(name = 'lena_response_count', description = 'LENA turn count within block', regex = r"(\d+(\.\d+)?)", na = True), + IndexColumn(name = 'lena_conv_floor_type', description = '(FI): Floor Initiation, (FH): Floor Holding', choices = ['FI', 'FH'], na = True), + IndexColumn(name = 'lena_conv_turn_type', description = 'LENA turn type', choices = ['TIFI', 'TIMI', 'TIFR', 'TIMR', 'TIFE', 'TIME', 'NT'], na = True), IndexColumn(name = 'utterances_count', description = 'utterances count', regex = r"(\d+(\.\d+)?)"), IndexColumn(name = 'utterances_length', description = 'utterances length', regex = r"([0-9]+)"), IndexColumn(name = 'non_speech_length', description = 'non-speech length', regex = r"([0-9]+)"), @@ -117,17 +118,25 @@ def read(self) -> Tuple[List[str], List[str]]: return errors, warnings + def write(self): + """Update the annotations index, + while enforcing its good shape. + """ + self.annotations[['time_seek', 'range_onset', 'range_offset']].fillna(0, inplace = True) + self.annotations[['time_seek', 'range_onset', 'range_offset']] = self.annotations[['time_seek', 'range_onset', 'range_offset']].astype(int) + self.annotations.to_csv(os.path.join(self.project.path, 'metadata/annotations.csv'), index = False) + def validate_annotation(self, annotation: dict) -> Tuple[List[str], List[str]]: print("validating {} from {}...".format(annotation['annotation_filename'], annotation['set'])) segments = IndexTable( 'segments', - path = os.path.join(self.project.path, 'annotations', annotation['set'], 'converted', str(annotation['annotation_filename'])), + path = os.path.join(self.project.path, 'annotations', annotation['set'], 'converted', annotation['annotation_filename']), columns = self.SEGMENTS_COLUMNS ) try: - segments.read() + segments.df = self._read_annotation(annotation['set'], annotation['annotation_filename']) except Exception as e: error_message = "error while trying to read {} from {}:\n\t{}".format( annotation['annotation_filename'], @@ -163,14 +172,38 @@ def validate(self, annotations: pd.DataFrame = None, threads: int = 0) -> Tuple[ return errors, warnings - def write(self): - """Update the annotations index, - while enforcing its good shape. - """ - self.annotations[['time_seek', 'range_onset', 'range_offset']].fillna(0, inplace = True) - self.annotations[['time_seek', 'range_onset', 'range_offset']] = self.annotations[['time_seek', 'range_onset', 'range_offset']].astype(int) - self.annotations.to_csv(os.path.join(self.project.path, 'metadata/annotations.csv'), index = False) - + def _read_annotation(self, set: str, filename: str): + path = os.path.join(self.project.path, 'annotations', set, 'converted', filename) + ext = os.path.splitext(filename)[1] + + if ext == '.csv': + return pd.read_csv(path) + elif ext == '.gz': + return pd.read_csv(path, compression = 'gzip') + elif ext == '.h5': + return pd.read_hdf(path) + elif ext == '.parquet': + return pd.read_parquet(path) + else: + raise ValueError(f"invalid extension '{ext}' for annotation {set}/{filename}'") + + def _write_annotation(self, df: pd.DataFrame, set: str, filename: str): + path = os.path.join(self.project.path, 'annotations', set, 'converted', filename) + ext = os.path.splitext(filename)[1] + + os.makedirs(os.path.dirname(path), exist_ok = True) + + if ext == '.csv': + df.to_csv(path, index = False) + elif ext == '.gz': + df.to_csv(path, index = False, compression = 'gzip') + elif ext == '.h5': + df.to_hdf(path, key = 'segments', mode = 'w', index = False) + elif ext == '.parquet': + df.to_parquet(path, index = False) + else: + raise ValueError(f"invalid extension '{ext}' for annotation {set}/{filename}'") + def _import_annotation(self, import_function: Callable[[str], pd.DataFrame], annotation: dict): """import and convert ``annotation``. This function should not be called outside of this class. @@ -183,9 +216,6 @@ def _import_annotation(self, import_function: Callable[[str], pd.DataFrame], ann """ source_recording = os.path.splitext(annotation['recording_filename'])[0] - annotation_filename = "{}_{}_{}.csv".format(source_recording, annotation['range_onset'], annotation['range_offset']) - output_filename = os.path.join('annotations', annotation['set'], 'converted', annotation_filename) - path = os.path.join(self.project.path, 'annotations', annotation['set'], 'raw', annotation['raw_filename']) annotation_format = annotation['format'] @@ -230,8 +260,21 @@ def _import_annotation(self, import_function: Callable[[str], pd.DataFrame], ann df.sort_values(sort_columns, inplace = True) - os.makedirs(os.path.dirname(os.path.join(self.project.path, output_filename)), exist_ok = True) - df.to_csv(os.path.join(self.project.path, output_filename), index = False) + if 'type' not in annotation or pd.isnull(annotation['type']): + annotation['type'] = 'csv' + + annotation_filename = "{}_{}_{}.{}".format( + source_recording, + annotation['range_onset'], + annotation['range_offset'], + annotation['type'] + ) + + self._write_annotation( + df, + annotation['set'], + annotation_filename + ) annotation['annotation_filename'] = annotation_filename annotation['imported_at'] = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") @@ -409,17 +452,18 @@ def rename_set(self, annotation_set: str, new_set: str, recursive: bool = False, self.annotations.loc[(self.annotations['set'] == annotation_set), 'set'] = new_set self.write() - def merge_annotations(self, left_columns, right_columns, columns, output_set, input): + def merge_annotations(self, left_columns, right_columns, columns, output_set, type, input): left_annotations = input['left_annotations'] right_annotations = input['right_annotations'] annotations = left_annotations.copy() annotations['format'] = '' annotations['annotation_filename'] = annotations.apply( - lambda annotation: "{}_{}_{}.csv".format( + lambda annotation: "{}_{}_{}.{}".format( os.path.splitext(annotation['recording_filename'])[0], annotation['range_onset'], - annotation['range_offset'] + annotation['range_offset'], + type ) , axis = 1) @@ -487,9 +531,11 @@ def merge_annotations(self, left_columns, right_columns, columns, output_set, in segments = output_segments[output_segments['interval'] == interval] segments.drop(columns = list(set(segments.columns)-{c.name for c in self.SEGMENTS_COLUMNS}), inplace = True) - segments.to_csv( - os.path.join(self.project.path, 'annotations', annotation_set, 'converted', annotation_filename), - index = False + + self._write_annotation( + segments, + annotation_set, + annotation_filename ) return annotations @@ -497,6 +543,7 @@ def merge_annotations(self, left_columns, right_columns, columns, output_set, in def merge_sets(self, left_set: str, right_set: str, left_columns: List[str], right_columns: List[str], output_set: str, columns: dict = {}, + type = 'csv', threads = -1 ): """Merge columns from ``left_set`` and ``right_set`` annotations, @@ -546,8 +593,12 @@ def merge_sets(self, left_set: str, right_set: str, for recording in left_annotations['recording_filename'].unique() ] - pool = mp.Pool(processes = threads if threads > 0 else mp.cpu_count()) - annotations = pool.map(partial(self.merge_annotations, left_columns, right_columns, columns, output_set), input_annotations) + with mp.Pool(processes = threads if threads > 0 else mp.cpu_count()) as pool: + annotations = pool.map( + partial(self.merge_annotations, left_columns, right_columns, columns, output_set, type), + input_annotations + ) + annotations = pd.concat(annotations) annotations.drop(columns = list(set(annotations.columns)-{c.name for c in self.INDEX_COLUMNS}), inplace = True) annotations.fillna({'raw_filename': 'NA'}, inplace = True) @@ -570,7 +621,7 @@ def get_segments(self, annotations: pd.DataFrame) -> pd.DataFrame: segments = [] for index, _annotations in annotations.groupby(['set', 'annotation_filename']): s, annotation_filename = index - df = pd.read_csv(os.path.join(self.project.path, 'annotations', s, 'converted', annotation_filename)) + df = self._read_annotation(s, annotation_filename) for annotation in _annotations.to_dict(orient = 'records'): segs = df.copy() diff --git a/ChildProject/tables.py b/ChildProject/tables.py index 1b3d5e83f..a7a824765 100644 --- a/ChildProject/tables.py +++ b/ChildProject/tables.py @@ -3,6 +3,7 @@ import re import datetime import numpy as np +from typing import Callable def is_boolean(x): return x == 'NA' or int(x) in [0,1] @@ -10,7 +11,8 @@ def is_boolean(x): class IndexColumn: def __init__(self, name = "", description = "", required = False, regex = None, filename = False, datetime = None, function = None, choices = None, - unique = False, generated = False): + unique = False, generated = False, + na = False): self.name = name self.description = description self.required = required @@ -21,6 +23,7 @@ def __init__(self, name = "", description = "", required = False, self.choices = choices self.unique = unique self.generated = generated + self.na = bool(na) def __str__(self): return 'IndexColumn(name = {})'.format(self.name) @@ -98,7 +101,9 @@ def validate(self): if column_attr is None: continue - if callable(column_attr.function): + if column_attr.na and pd.isnull(row[column_name]): + continue + elif callable(column_attr.function): try: ok = column_attr.function(str(row[column_name])) == True except: diff --git a/examples/valid_raw_data/annotations/input.csv b/examples/valid_raw_data/annotations/input.csv index 8b8072cff..712a1fd34 100644 --- a/examples/valid_raw_data/annotations/input.csv +++ b/examples/valid_raw_data/annotations/input.csv @@ -1,9 +1,9 @@ -set,recording_filename,time_seek,raw_filename,range_onset,range_offset,format,filter -textgrid,sound.wav,0,example.TextGrid,0,10000,TextGrid, -eaf_basic,sound.wav,0,example.eaf,0,300000,eaf, -eaf_solis,sound.wav,0,example_solis.eaf,0,40000000,eaf, -vtc_rttm,sound.wav,0,example.rttm,1980000,1990000,vtc_rttm,namibie_aiku_20160714_1 -alice,sound.wav,0,example_alice.txt,1980000,1990000,alice,namibie_aiku_20160714_1 -metrics,sound.wav,0,example_metrics.rttm,0,100000000,vtc_rttm,tsimane2017_C01_20170706 -old_its,sound.wav,0,example_lena_old.its,0,100000000,its, +set,recording_filename,time_seek,raw_filename,range_onset,range_offset,format,filter +textgrid,sound.wav,0,example.TextGrid,0,10000,TextGrid, +eaf_basic,sound.wav,0,example.eaf,0,300000,eaf, +eaf_solis,sound.wav,0,example_solis.eaf,0,40000000,eaf, +vtc_rttm,sound.wav,0,example.rttm,1980000,1990000,vtc_rttm,namibie_aiku_20160714_1 +alice,sound.wav,0,example_alice.txt,1980000,1990000,alice,namibie_aiku_20160714_1 +metrics,sound.wav,0,example_metrics.rttm,0,100000000,vtc_rttm,tsimane2017_C01_20170706 +old_its,sound.wav,0,example_lena_old.its,0,100000000,its, new_its,sound.wav,0,example_lena_new.its,0,100000000,its, \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 2d039e6bf..78c318fa1 100644 --- a/requirements.txt +++ b/requirements.txt @@ -11,6 +11,7 @@ pydub pandas>=0.25.0 panoptes_client pyannote.metrics; python_version >= "3.7.0" +pyarrow pygamma-agreement; python_version >= "3.6.0" pylangacq pympi-ling @@ -22,3 +23,4 @@ sklearn sox sphinx sphinx_rtd_theme +tables diff --git a/setup.py b/setup.py index 4cfd52d0b..e5cd5faf6 100644 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ requires = { 'core': ['pandas>=0.25.0', 'jinja2', 'numpy>=1.16.5', 'sox', 'datalad', 'requests<2.25.0'], - 'annotations': ['lxml', 'pympi-ling', 'pylangacq', 'python-dateutil>=2.8.1'], + 'annotations': ['lxml', 'pyarrow', 'pympi-ling', 'pylangacq', 'python-dateutil>=2.8.1', 'tables'], 'metrics': ['pyannote.metrics; python_version >= "3.7.0"', 'pygamma-agreement; python_version >= "3.6.0"', 'nltk', 'sklearn'], 'audio': ['librosa', 'pydub', 'pysoundfile'], 'samplers': ['PyYAML'], diff --git a/tests/test_annotations.py b/tests/test_annotations.py index 966a6a9ed..323c2b11e 100644 --- a/tests/test_annotations.py +++ b/tests/test_annotations.py @@ -98,10 +98,12 @@ def test_its(its): )#.fillna('NA') check_its(converted, truth) -def test_import(project): - am = AnnotationManager(project) - +@pytest.mark.parametrize('type', ['csv', 'gz', 'h5', 'parquet']) +def test_import(project, type): input_annotations = pd.read_csv('examples/valid_raw_data/annotations/input.csv') + input_annotations['type'] = type + + am = AnnotationManager(project) am.import_annotations(input_annotations) am.read() @@ -113,16 +115,15 @@ def test_import(project): ]), "some annotations are missing" errors, warnings = am.validate() - assert len(errors) == 0 and len(warnings) == 0, "malformed annotations detected" + assert len(errors) == 0 and len(warnings) == 0, f"malformed annotations detected ({errors} {warnings})" for dataset in ['eaf_basic', 'textgrid', 'eaf_solis']: annotations = am.annotations[am.annotations['set'] == dataset] segments = am.get_segments(annotations) segments.drop(columns = set(annotations.columns) - {'raw_filename'}, inplace = True) - truth = pd.read_csv('tests/truth/{}.csv'.format(dataset)) + truth = pd.read_csv('tests/truth/{}.csv'.format(dataset), dtype = {'transcription': str, 'ling_type': str}) - print(segments) - print(truth) + print(annotations) pd.testing.assert_frame_equal( standardize_dataframe(segments, set(truth.columns.tolist())), @@ -146,6 +147,7 @@ def test_intersect(project): columns = a.columns.tolist() columns.remove('imported_at') columns.remove('package_version') + columns.remove('type') pd.testing.assert_frame_equal( standardize_dataframe(a, columns), diff --git a/tests/truth/eaf_solis.csv b/tests/truth/eaf_solis.csv index 79fde8beb..6de0abf7c 100644 --- a/tests/truth/eaf_solis.csv +++ b/tests/truth/eaf_solis.csv @@ -1,223 +1,223 @@ segment_onset,segment_offset,speaker_id,speaker_type,vcm_type,transcription,raw_filename -2040011,2041402,CHI,CHI,C,0.0,example_solis.eaf -2041636,2042188,CHI,CHI,N,0.0,example_solis.eaf -2042882,2044815,CHI,CHI,C,0.0,example_solis.eaf -2045358,2047390,CHI,CHI,C,0.0,example_solis.eaf -2047780,2049921,CHI,CHI,C,0.0,example_solis.eaf -2050737,2052385,CHI,CHI,C,0.0,example_solis.eaf -5640583,5641625,CHI,CHI,C,0.0,example_solis.eaf -5642196,5643019,CHI,CHI,C,0.0,example_solis.eaf -5643356,5644721,CHI,CHI,N,0.0,example_solis.eaf -5645560,5646356,CHI,CHI,C,0.0,example_solis.eaf -5648323,5649199,CHI,CHI,C,0.0,example_solis.eaf -5650566,5651740,CHI,CHI,C,0.0,example_solis.eaf -5653545,5654849,CHI,CHI,C,0.0,example_solis.eaf -9250190,9251136,CHI,CHI,C,0.0,example_solis.eaf -9253136,9253979,CHI,CHI,N,0.0,example_solis.eaf -9258465,9259223,CHI,CHI,C,0.0,example_solis.eaf -9260768,9261403,CHI,CHI,N,0.0,example_solis.eaf -9261973,9262485,CHI,CHI,C,0.0,example_solis.eaf -9268778,9269241,CHI,CHI,N,0.0,example_solis.eaf -9276268,9277697,CHI,CHI,C,0.0,example_solis.eaf -9279693,9280185,CHI,CHI,N,0.0,example_solis.eaf -9292510,9293043,CHI,CHI,N,0.0,example_solis.eaf -9297693,9298775,CHI,CHI,C,0.0,example_solis.eaf -9299360,9300001,CHI,CHI,C,0.0,example_solis.eaf -16468675,16469743,CHI,CHI,N,0.0,example_solis.eaf -16480849,16481485,CHI,CHI,N,0.0,example_solis.eaf -20040816,20041540,CHI,CHI,N,0.0,example_solis.eaf -20041780,20042636,CHI,CHI,C,0.0,example_solis.eaf -20043206,20045540,CHI,CHI,C,0.0,example_solis.eaf -20045846,20047261,CHI,CHI,Y,0.0,example_solis.eaf -20047880,20049240,CHI,CHI,Y,0.0,example_solis.eaf -20050058,20052126,CHI,CHI,Y,0.0,example_solis.eaf -20085822,20087628,CHI,CHI,N,0.0,example_solis.eaf -20089511,20092278,CHI,CHI,Y,0.0,example_solis.eaf -20092996,20093708,CHI,CHI,Y,0.0,example_solis.eaf -20094588,20095900,CHI,CHI,C,0.0,example_solis.eaf -20098784,20099958,CHI,CHI,Y,0.0,example_solis.eaf -30840296,30842035,CHI,CHI,C,0.0,example_solis.eaf -30842672,30843932,CHI,CHI,N,0.0,example_solis.eaf -30845174,30846688,CHI,CHI,N,0.0,example_solis.eaf -30859894,30861840,CHI,CHI,N,0.0,example_solis.eaf -30863947,30865683,CHI,CHI,N,0.0,example_solis.eaf -30867618,30868798,CHI,CHI,N,0.0,example_solis.eaf -30870093,30871266,CHI,CHI,N,0.0,example_solis.eaf -30883626,30883978,CHI,CHI,N,0.0,example_solis.eaf -30889086,30889667,CHI,CHI,C,0.0,example_solis.eaf -30892420,30892990,CHI,CHI,C,0.0,example_solis.eaf -30893642,30894166,CHI,CHI,N,0.0,example_solis.eaf -30894676,30895216,CHI,CHI,N,0.0,example_solis.eaf -30895751,30896356,CHI,CHI,N,0.0,example_solis.eaf -34481907,34482516,CHI,CHI,N,0.0,example_solis.eaf -34484776,34485896,CHI,CHI,N,0.0,example_solis.eaf -38046133,38046333,CHI,CHI,N,0.0,example_solis.eaf -38047344,38048407,CHI,CHI,N,0.0,example_solis.eaf -38049948,38052451,CHI,CHI,N,0.0,example_solis.eaf -38053104,38053832,CHI,CHI,N,0.0,example_solis.eaf -38058740,38059595,CHI,CHI,C,0.0,example_solis.eaf -38061800,38062612,CHI,CHI,C,0.0,example_solis.eaf -38062835,38064128,CHI,CHI,C,0.0,example_solis.eaf -38066504,38067816,CHI,CHI,N,0.0,example_solis.eaf -38068440,38069164,CHI,CHI,N,0.0,example_solis.eaf -38071060,38073233,CHI,CHI,Y,0.0,example_solis.eaf -38074763,38075544,CHI,CHI,N,0.0,example_solis.eaf -38076996,38078500,CHI,CHI,N,0.0,example_solis.eaf -38079536,38080096,CHI,CHI,N,0.0,example_solis.eaf -38081888,38083587,CHI,CHI,C,0.0,example_solis.eaf -38084006,38085410,CHI,CHI,C,0.0,example_solis.eaf -2061245,2062770,FA1,FEM,C,0.0,example_solis.eaf -2063607,2064346,FA1,FEM,L,0.0,example_solis.eaf -2086745,2088016,FA1,FEM,C,0.0,example_solis.eaf -5651911,5652924,FA1,FEM,C,0.0,example_solis.eaf -5654890,5656763,FA1,FEM,C,0.0,example_solis.eaf -5657314,5657903,FA1,FEM,C,0.0,example_solis.eaf -5658016,5659553,FA1,FEM,C,0.0,example_solis.eaf -5666343,5668472,FA1,FEM,C,0.0,example_solis.eaf -5674611,5675024,FA1,FEM,C,0.0,example_solis.eaf -5680458,5686093,FA1,FEM,C,0.0,example_solis.eaf -5687161,5689723,FA1,FEM,C,0.0,example_solis.eaf -5699746,5700031,FA1,FEM,C,0.0,example_solis.eaf -9240153,9244760,FA1,FEM,C,0.0,example_solis.eaf -9264821,9265671,FA1,FEM,C,0.0,example_solis.eaf -9266718,9268345,FA1,FEM,C,0.0,example_solis.eaf -9270848,9271841,FA1,FEM,C,0.0,example_solis.eaf -9274278,9274715,FA1,FEM,C,0.0,example_solis.eaf -9289818,9291794,FA1,FEM,C,0.0,example_solis.eaf -9295398,9296633,FA1,FEM,C,0.0,example_solis.eaf -12840000,12840323,FA1,FEM,C,0.0,example_solis.eaf -12840716,12841438,FA1,FEM,C,0.0,example_solis.eaf -12846118,12846796,FA1,FEM,C,0.0,example_solis.eaf -12848613,12851055,FA1,FEM,C,0.0,example_solis.eaf -12853698,12854645,FA1,FEM,C,0.0,example_solis.eaf -12858621,12859423,FA1,FEM,C,0.0,example_solis.eaf -12871450,12873755,FA1,FEM,C,0.0,example_solis.eaf -12875586,12880468,FA1,FEM,C,0.0,example_solis.eaf -12880945,12882458,FA1,FEM,C,0.0,example_solis.eaf -12882845,12884219,FA1,FEM,C,0.0,example_solis.eaf -12896473,12900000,FA1,FEM,C,0.0,example_solis.eaf -16486956,16487658,FA1,FEM,C,0.0,example_solis.eaf -16496005,16497335,FA1,FEM,C,0.0,example_solis.eaf -20040028,20041392,FA1,FEM,C,0.0,example_solis.eaf -20041540,20043828,FA1,FEM,C,0.0,example_solis.eaf -20046831,20047182,FA1,FEM,C,0.0,example_solis.eaf -20050512,20050956,FA1,FEM,C,0.0,example_solis.eaf -20053345,20057680,FA1,FEM,C,0.0,example_solis.eaf -20058230,20059248,FA1,FEM,C,0.0,example_solis.eaf -20060790,20061650,FA1,FEM,C,0.0,example_solis.eaf -20061862,20063870,FA1,FEM,C,0.0,example_solis.eaf -20064368,20068631,FA1,FEM,C,0.0,example_solis.eaf -20075488,20077838,FA1,FEM,C,0.0,example_solis.eaf -20081693,20083941,FA1,FEM,C,0.0,example_solis.eaf -20086966,20088721,FA1,FEM,C,0.0,example_solis.eaf -20095675,20096660,FA1,FEM,C,0.0,example_solis.eaf -20098721,20099003,FA1,FEM,N,0.0,example_solis.eaf -34482740,34484808,FA1,FEM,L,0.0,example_solis.eaf -34485885,34488052,FA1,FEM,C,0.0,example_solis.eaf -34492052,34492672,FA1,FEM,C,0.0,example_solis.eaf -34496998,34498084,FA1,FEM,C,0.0,example_solis.eaf -34498980,34499415,FA1,FEM,N,0.0,example_solis.eaf -38048096,38048972,FA1,FEM,C,0.0,example_solis.eaf -38059212,38060200,FA1,FEM,C,0.0,example_solis.eaf -38069720,38071072,FA1,FEM,N,0.0,example_solis.eaf -38072108,38072852,FA1,FEM,C,0.0,example_solis.eaf -38084664,38085616,FA1,FEM,N,0.0,example_solis.eaf -38092555,38093461,FA1,FEM,C,0.0,example_solis.eaf -38099160,38100008,FA1,FEM,C,0.0,example_solis.eaf -2059525,2060652,MA1,MAL,C,0.0,example_solis.eaf -2075295,2076027,MA1,MAL,C,0.0,example_solis.eaf -2095000,2096067,MA1,MAL,L,0.0,example_solis.eaf -5679749,5680182,MA1,MAL,C,0.0,example_solis.eaf -27268420,27269793,MA1,MAL,C,0.0,example_solis.eaf -2074205,2075038,MC1,OCH,C,0.0,example_solis.eaf -12852905,12854312,MC1,OCH,N,0.0,example_solis.eaf -12854913,12859380,MC1,OCH,N,0.0,example_solis.eaf -12861184,12863266,MC1,OCH,N,0.0,example_solis.eaf -12863478,12865986,MC1,OCH,N,0.0,example_solis.eaf -12867083,12868605,MC1,OCH,N,0.0,example_solis.eaf -12870216,12871476,MC1,OCH,N,0.0,example_solis.eaf -12875291,12876758,MC1,OCH,N,0.0,example_solis.eaf -12881783,12883521,MC1,OCH,N,0.0,example_solis.eaf -12886499,12889160,MC1,OCH,N,0.0,example_solis.eaf -12890681,12892080,MC1,OCH,N,0.0,example_solis.eaf -12895230,12896595,MC1,OCH,N,0.0,example_solis.eaf -16442316,16444346,MC1,OCH,C,0.0,example_solis.eaf -16445096,16445991,MC1,OCH,C,0.0,example_solis.eaf -16446395,16447543,MC1,OCH,C,0.0,example_solis.eaf -16447976,16449096,MC1,OCH,C,0.0,example_solis.eaf -16450193,16451004,MC1,OCH,C,0.0,example_solis.eaf -16451547,16452735,MC1,OCH,C,0.0,example_solis.eaf -16453218,16454476,MC1,OCH,C,0.0,example_solis.eaf -16454898,16455968,MC1,OCH,C,0.0,example_solis.eaf -16456625,16457338,MC1,OCH,C,0.0,example_solis.eaf -16458113,16458698,MC1,OCH,C,0.0,example_solis.eaf -16459168,16460301,MC1,OCH,C,0.0,example_solis.eaf -16460759,16461109,MC1,OCH,N,0.0,example_solis.eaf -16462191,16463340,MC1,OCH,C,0.0,example_solis.eaf -16463968,16464851,MC1,OCH,N,0.0,example_solis.eaf -16465301,16466529,MC1,OCH,C,0.0,example_solis.eaf -16470330,16472183,MC1,OCH,N,0.0,example_solis.eaf -16474246,16479086,MC1,OCH,C,0.0,example_solis.eaf -16480278,16480786,MC1,OCH,C,0.0,example_solis.eaf -16482578,16484366,MC1,OCH,C,0.0,example_solis.eaf -16486259,16487008,MC1,OCH,C,0.0,example_solis.eaf -16488453,16489490,MC1,OCH,C,0.0,example_solis.eaf -16490044,16490668,MC1,OCH,C,0.0,example_solis.eaf -20071038,20071626,MC1,OCH,C,0.0,example_solis.eaf -30862998,30863476,MC1,OCH,N,0.0,example_solis.eaf -30866286,30867630,MC1,OCH,C,0.0,example_solis.eaf -30873810,30875048,MC1,OCH,C,0.0,example_solis.eaf -30875568,30877592,MC1,OCH,N,0.0,example_solis.eaf -30884562,30885692,MC1,OCH,N,0.0,example_solis.eaf -30886696,30887208,MC1,OCH,N,0.0,example_solis.eaf -2052379,2054899,FA2,FEM,C,0.0,example_solis.eaf -2066262,2067201,FA2,FEM,C,0.0,example_solis.eaf -2067625,2070530,FA2,FEM,C,0.0,example_solis.eaf -2076275,2077670,FA2,FEM,C,0.0,example_solis.eaf -2084316,2085201,FA2,FEM,C,0.0,example_solis.eaf -2087407,2089301,FA2,FEM,C,0.0,example_solis.eaf -5660275,5660985,FA2,FEM,C,0.0,example_solis.eaf -5661491,5662900,FA2,FEM,C,0.0,example_solis.eaf -5663070,5665229,FA2,FEM,C,0.0,example_solis.eaf -5665356,5666286,FA2,FEM,C,0.0,example_solis.eaf -5672385,5673720,FA2,FEM,C,0.0,example_solis.eaf -5673863,5674471,FA2,FEM,C,0.0,example_solis.eaf -5675106,5676206,FA2,FEM,C,0.0,example_solis.eaf -5677188,5679630,FA2,FEM,C,0.0,example_solis.eaf -5689708,5691048,FA2,FEM,C,0.0,example_solis.eaf -5692754,5694001,FA2,FEM,C,0.0,example_solis.eaf -5696901,5698993,FA2,FEM,C,0.0,example_solis.eaf -9246063,9246931,FA2,FEM,C,0.0,example_solis.eaf -9251233,9252631,FA2,FEM,C,0.0,example_solis.eaf -9255275,9255730,FA2,FEM,C,0.0,example_solis.eaf -9256234,9257043,FA2,FEM,C,0.0,example_solis.eaf -9259392,9260171,FA2,FEM,C,0.0,example_solis.eaf -9262843,9264466,FA2,FEM,C,0.0,example_solis.eaf -9269583,9272051,FA2,FEM,C,0.0,example_solis.eaf -9273134,9274023,FA2,FEM,C,0.0,example_solis.eaf -9292122,9293921,FA2,FEM,C,0.0,example_solis.eaf -12840465,12840692,FA2,FEM,C,0.0,example_solis.eaf -12841507,12843743,FA2,FEM,C,0.0,example_solis.eaf -12844253,12845278,FA2,FEM,C,0.0,example_solis.eaf -12848015,12848523,FA2,FEM,C,0.0,example_solis.eaf -12852228,12852905,FA2,FEM,C,0.0,example_solis.eaf -12860572,12863368,FA2,FEM,C,0.0,example_solis.eaf -12864665,12868420,FA2,FEM,C,0.0,example_solis.eaf -12868660,12871453,FA2,FEM,C,0.0,example_solis.eaf -12884091,12885940,FA2,FEM,C,0.0,example_solis.eaf -12887845,12888913,FA2,FEM,C,0.0,example_solis.eaf -12889666,12890760,FA2,FEM,C,0.0,example_solis.eaf -12891591,12896093,FA2,FEM,C,0.0,example_solis.eaf -16441043,16442262,FA2,FEM,C,0.0,example_solis.eaf -16489360,16490011,FA2,FEM,C,0.0,example_solis.eaf -16498076,16500000,FA2,FEM,C,0.0,example_solis.eaf -20051262,20053082,FA2,FEM,C,0.0,example_solis.eaf -20059248,20060742,FA2,FEM,C,0.0,example_solis.eaf -20072578,20075488,FA2,FEM,C,0.0,example_solis.eaf -20080464,20081904,FA2,FEM,C,0.0,example_solis.eaf -20084116,20086361,FA2,FEM,C,0.0,example_solis.eaf -20088718,20089846,FA2,FEM,C,0.0,example_solis.eaf -30874082,30875914,FA2,FEM,C,0.0,example_solis.eaf -34491376,34492275,FA2,FEM,C,0.0,example_solis.eaf -34493480,34493918,FA2,FEM,N,0.0,example_solis.eaf -34498204,34498983,FA2,FEM,C,0.0,example_solis.eaf +2040011,2041402,CHI,CHI,C,0.,example_solis.eaf +2041636,2042188,CHI,CHI,N,0.,example_solis.eaf +2042882,2044815,CHI,CHI,C,0.,example_solis.eaf +2045358,2047390,CHI,CHI,C,0.,example_solis.eaf +2047780,2049921,CHI,CHI,C,0.,example_solis.eaf +2050737,2052385,CHI,CHI,C,0.,example_solis.eaf +5640583,5641625,CHI,CHI,C,0.,example_solis.eaf +5642196,5643019,CHI,CHI,C,0.,example_solis.eaf +5643356,5644721,CHI,CHI,N,0.,example_solis.eaf +5645560,5646356,CHI,CHI,C,0.,example_solis.eaf +5648323,5649199,CHI,CHI,C,0.,example_solis.eaf +5650566,5651740,CHI,CHI,C,0.,example_solis.eaf +5653545,5654849,CHI,CHI,C,0.,example_solis.eaf +9250190,9251136,CHI,CHI,C,0.,example_solis.eaf +9253136,9253979,CHI,CHI,N,0.,example_solis.eaf +9258465,9259223,CHI,CHI,C,0.,example_solis.eaf +9260768,9261403,CHI,CHI,N,0.,example_solis.eaf +9261973,9262485,CHI,CHI,C,0.,example_solis.eaf +9268778,9269241,CHI,CHI,N,0.,example_solis.eaf +9276268,9277697,CHI,CHI,C,0.,example_solis.eaf +9279693,9280185,CHI,CHI,N,0.,example_solis.eaf +9292510,9293043,CHI,CHI,N,0.,example_solis.eaf +9297693,9298775,CHI,CHI,C,0.,example_solis.eaf +9299360,9300001,CHI,CHI,C,0.,example_solis.eaf +16468675,16469743,CHI,CHI,N,0.,example_solis.eaf +16480849,16481485,CHI,CHI,N,0.,example_solis.eaf +20040816,20041540,CHI,CHI,N,0.,example_solis.eaf +20041780,20042636,CHI,CHI,C,0.,example_solis.eaf +20043206,20045540,CHI,CHI,C,0.,example_solis.eaf +20045846,20047261,CHI,CHI,Y,0.,example_solis.eaf +20047880,20049240,CHI,CHI,Y,0.,example_solis.eaf +20050058,20052126,CHI,CHI,Y,0.,example_solis.eaf +20085822,20087628,CHI,CHI,N,0.,example_solis.eaf +20089511,20092278,CHI,CHI,Y,0.,example_solis.eaf +20092996,20093708,CHI,CHI,Y,0.,example_solis.eaf +20094588,20095900,CHI,CHI,C,0.,example_solis.eaf +20098784,20099958,CHI,CHI,Y,0.,example_solis.eaf +30840296,30842035,CHI,CHI,C,0.,example_solis.eaf +30842672,30843932,CHI,CHI,N,0.,example_solis.eaf +30845174,30846688,CHI,CHI,N,0.,example_solis.eaf +30859894,30861840,CHI,CHI,N,0.,example_solis.eaf +30863947,30865683,CHI,CHI,N,0.,example_solis.eaf +30867618,30868798,CHI,CHI,N,0.,example_solis.eaf +30870093,30871266,CHI,CHI,N,0.,example_solis.eaf +30883626,30883978,CHI,CHI,N,0.,example_solis.eaf +30889086,30889667,CHI,CHI,C,0.,example_solis.eaf +30892420,30892990,CHI,CHI,C,0.,example_solis.eaf +30893642,30894166,CHI,CHI,N,0.,example_solis.eaf +30894676,30895216,CHI,CHI,N,0.,example_solis.eaf +30895751,30896356,CHI,CHI,N,0.,example_solis.eaf +34481907,34482516,CHI,CHI,N,0.,example_solis.eaf +34484776,34485896,CHI,CHI,N,0.,example_solis.eaf +38046133,38046333,CHI,CHI,N,0.,example_solis.eaf +38047344,38048407,CHI,CHI,N,0.,example_solis.eaf +38049948,38052451,CHI,CHI,N,0.,example_solis.eaf +38053104,38053832,CHI,CHI,N,0.,example_solis.eaf +38058740,38059595,CHI,CHI,C,0.,example_solis.eaf +38061800,38062612,CHI,CHI,C,0.,example_solis.eaf +38062835,38064128,CHI,CHI,C,0.,example_solis.eaf +38066504,38067816,CHI,CHI,N,0.,example_solis.eaf +38068440,38069164,CHI,CHI,N,0.,example_solis.eaf +38071060,38073233,CHI,CHI,Y,0.,example_solis.eaf +38074763,38075544,CHI,CHI,N,0.,example_solis.eaf +38076996,38078500,CHI,CHI,N,0.,example_solis.eaf +38079536,38080096,CHI,CHI,N,0.,example_solis.eaf +38081888,38083587,CHI,CHI,C,0.,example_solis.eaf +38084006,38085410,CHI,CHI,C,0.,example_solis.eaf +2061245,2062770,FA1,FEM,C,0.,example_solis.eaf +2063607,2064346,FA1,FEM,L,0.,example_solis.eaf +2086745,2088016,FA1,FEM,C,0.,example_solis.eaf +5651911,5652924,FA1,FEM,C,0.,example_solis.eaf +5654890,5656763,FA1,FEM,C,0.,example_solis.eaf +5657314,5657903,FA1,FEM,C,0.,example_solis.eaf +5658016,5659553,FA1,FEM,C,0.,example_solis.eaf +5666343,5668472,FA1,FEM,C,0.,example_solis.eaf +5674611,5675024,FA1,FEM,C,0.,example_solis.eaf +5680458,5686093,FA1,FEM,C,0.,example_solis.eaf +5687161,5689723,FA1,FEM,C,0.,example_solis.eaf +5699746,5700031,FA1,FEM,C,0.,example_solis.eaf +9240153,9244760,FA1,FEM,C,0.,example_solis.eaf +9264821,9265671,FA1,FEM,C,0.,example_solis.eaf +9266718,9268345,FA1,FEM,C,0.,example_solis.eaf +9270848,9271841,FA1,FEM,C,0.,example_solis.eaf +9274278,9274715,FA1,FEM,C,0.,example_solis.eaf +9289818,9291794,FA1,FEM,C,0.,example_solis.eaf +9295398,9296633,FA1,FEM,C,0.,example_solis.eaf +12840000,12840323,FA1,FEM,C,0.,example_solis.eaf +12840716,12841438,FA1,FEM,C,0.,example_solis.eaf +12846118,12846796,FA1,FEM,C,0.,example_solis.eaf +12848613,12851055,FA1,FEM,C,0.,example_solis.eaf +12853698,12854645,FA1,FEM,C,0.,example_solis.eaf +12858621,12859423,FA1,FEM,C,0.,example_solis.eaf +12871450,12873755,FA1,FEM,C,0.,example_solis.eaf +12875586,12880468,FA1,FEM,C,0.,example_solis.eaf +12880945,12882458,FA1,FEM,C,0.,example_solis.eaf +12882845,12884219,FA1,FEM,C,0.,example_solis.eaf +12896473,12900000,FA1,FEM,C,0.,example_solis.eaf +16486956,16487658,FA1,FEM,C,0.,example_solis.eaf +16496005,16497335,FA1,FEM,C,0.,example_solis.eaf +20040028,20041392,FA1,FEM,C,0.,example_solis.eaf +20041540,20043828,FA1,FEM,C,0.,example_solis.eaf +20046831,20047182,FA1,FEM,C,0.,example_solis.eaf +20050512,20050956,FA1,FEM,C,0.,example_solis.eaf +20053345,20057680,FA1,FEM,C,0.,example_solis.eaf +20058230,20059248,FA1,FEM,C,0.,example_solis.eaf +20060790,20061650,FA1,FEM,C,0.,example_solis.eaf +20061862,20063870,FA1,FEM,C,0.,example_solis.eaf +20064368,20068631,FA1,FEM,C,0.,example_solis.eaf +20075488,20077838,FA1,FEM,C,0.,example_solis.eaf +20081693,20083941,FA1,FEM,C,0.,example_solis.eaf +20086966,20088721,FA1,FEM,C,0.,example_solis.eaf +20095675,20096660,FA1,FEM,C,0.,example_solis.eaf +20098721,20099003,FA1,FEM,N,0.,example_solis.eaf +34482740,34484808,FA1,FEM,L,0.,example_solis.eaf +34485885,34488052,FA1,FEM,C,0.,example_solis.eaf +34492052,34492672,FA1,FEM,C,0.,example_solis.eaf +34496998,34498084,FA1,FEM,C,0.,example_solis.eaf +34498980,34499415,FA1,FEM,N,0.,example_solis.eaf +38048096,38048972,FA1,FEM,C,0.,example_solis.eaf +38059212,38060200,FA1,FEM,C,0.,example_solis.eaf +38069720,38071072,FA1,FEM,N,0.,example_solis.eaf +38072108,38072852,FA1,FEM,C,0.,example_solis.eaf +38084664,38085616,FA1,FEM,N,0.,example_solis.eaf +38092555,38093461,FA1,FEM,C,0.,example_solis.eaf +38099160,38100008,FA1,FEM,C,0.,example_solis.eaf +2059525,2060652,MA1,MAL,C,0.,example_solis.eaf +2075295,2076027,MA1,MAL,C,0.,example_solis.eaf +2095000,2096067,MA1,MAL,L,0.,example_solis.eaf +5679749,5680182,MA1,MAL,C,0.,example_solis.eaf +27268420,27269793,MA1,MAL,C,0.,example_solis.eaf +2074205,2075038,MC1,OCH,C,0.,example_solis.eaf +12852905,12854312,MC1,OCH,N,0.,example_solis.eaf +12854913,12859380,MC1,OCH,N,0.,example_solis.eaf +12861184,12863266,MC1,OCH,N,0.,example_solis.eaf +12863478,12865986,MC1,OCH,N,0.,example_solis.eaf +12867083,12868605,MC1,OCH,N,0.,example_solis.eaf +12870216,12871476,MC1,OCH,N,0.,example_solis.eaf +12875291,12876758,MC1,OCH,N,0.,example_solis.eaf +12881783,12883521,MC1,OCH,N,0.,example_solis.eaf +12886499,12889160,MC1,OCH,N,0.,example_solis.eaf +12890681,12892080,MC1,OCH,N,0.,example_solis.eaf +12895230,12896595,MC1,OCH,N,0.,example_solis.eaf +16442316,16444346,MC1,OCH,C,0.,example_solis.eaf +16445096,16445991,MC1,OCH,C,0.,example_solis.eaf +16446395,16447543,MC1,OCH,C,0.,example_solis.eaf +16447976,16449096,MC1,OCH,C,0.,example_solis.eaf +16450193,16451004,MC1,OCH,C,0.,example_solis.eaf +16451547,16452735,MC1,OCH,C,0.,example_solis.eaf +16453218,16454476,MC1,OCH,C,0.,example_solis.eaf +16454898,16455968,MC1,OCH,C,0.,example_solis.eaf +16456625,16457338,MC1,OCH,C,0.,example_solis.eaf +16458113,16458698,MC1,OCH,C,0.,example_solis.eaf +16459168,16460301,MC1,OCH,C,0.,example_solis.eaf +16460759,16461109,MC1,OCH,N,0.,example_solis.eaf +16462191,16463340,MC1,OCH,C,0.,example_solis.eaf +16463968,16464851,MC1,OCH,N,0.,example_solis.eaf +16465301,16466529,MC1,OCH,C,0.,example_solis.eaf +16470330,16472183,MC1,OCH,N,0.,example_solis.eaf +16474246,16479086,MC1,OCH,C,0.,example_solis.eaf +16480278,16480786,MC1,OCH,C,0.,example_solis.eaf +16482578,16484366,MC1,OCH,C,0.,example_solis.eaf +16486259,16487008,MC1,OCH,C,0.,example_solis.eaf +16488453,16489490,MC1,OCH,C,0.,example_solis.eaf +16490044,16490668,MC1,OCH,C,0.,example_solis.eaf +20071038,20071626,MC1,OCH,C,0.,example_solis.eaf +30862998,30863476,MC1,OCH,N,0.,example_solis.eaf +30866286,30867630,MC1,OCH,C,0.,example_solis.eaf +30873810,30875048,MC1,OCH,C,0.,example_solis.eaf +30875568,30877592,MC1,OCH,N,0.,example_solis.eaf +30884562,30885692,MC1,OCH,N,0.,example_solis.eaf +30886696,30887208,MC1,OCH,N,0.,example_solis.eaf +2052379,2054899,FA2,FEM,C,0.,example_solis.eaf +2066262,2067201,FA2,FEM,C,0.,example_solis.eaf +2067625,2070530,FA2,FEM,C,0.,example_solis.eaf +2076275,2077670,FA2,FEM,C,0.,example_solis.eaf +2084316,2085201,FA2,FEM,C,0.,example_solis.eaf +2087407,2089301,FA2,FEM,C,0.,example_solis.eaf +5660275,5660985,FA2,FEM,C,0.,example_solis.eaf +5661491,5662900,FA2,FEM,C,0.,example_solis.eaf +5663070,5665229,FA2,FEM,C,0.,example_solis.eaf +5665356,5666286,FA2,FEM,C,0.,example_solis.eaf +5672385,5673720,FA2,FEM,C,0.,example_solis.eaf +5673863,5674471,FA2,FEM,C,0.,example_solis.eaf +5675106,5676206,FA2,FEM,C,0.,example_solis.eaf +5677188,5679630,FA2,FEM,C,0.,example_solis.eaf +5689708,5691048,FA2,FEM,C,0.,example_solis.eaf +5692754,5694001,FA2,FEM,C,0.,example_solis.eaf +5696901,5698993,FA2,FEM,C,0.,example_solis.eaf +9246063,9246931,FA2,FEM,C,0.,example_solis.eaf +9251233,9252631,FA2,FEM,C,0.,example_solis.eaf +9255275,9255730,FA2,FEM,C,0.,example_solis.eaf +9256234,9257043,FA2,FEM,C,0.,example_solis.eaf +9259392,9260171,FA2,FEM,C,0.,example_solis.eaf +9262843,9264466,FA2,FEM,C,0.,example_solis.eaf +9269583,9272051,FA2,FEM,C,0.,example_solis.eaf +9273134,9274023,FA2,FEM,C,0.,example_solis.eaf +9292122,9293921,FA2,FEM,C,0.,example_solis.eaf +12840465,12840692,FA2,FEM,C,0.,example_solis.eaf +12841507,12843743,FA2,FEM,C,0.,example_solis.eaf +12844253,12845278,FA2,FEM,C,0.,example_solis.eaf +12848015,12848523,FA2,FEM,C,0.,example_solis.eaf +12852228,12852905,FA2,FEM,C,0.,example_solis.eaf +12860572,12863368,FA2,FEM,C,0.,example_solis.eaf +12864665,12868420,FA2,FEM,C,0.,example_solis.eaf +12868660,12871453,FA2,FEM,C,0.,example_solis.eaf +12884091,12885940,FA2,FEM,C,0.,example_solis.eaf +12887845,12888913,FA2,FEM,C,0.,example_solis.eaf +12889666,12890760,FA2,FEM,C,0.,example_solis.eaf +12891591,12896093,FA2,FEM,C,0.,example_solis.eaf +16441043,16442262,FA2,FEM,C,0.,example_solis.eaf +16489360,16490011,FA2,FEM,C,0.,example_solis.eaf +16498076,16500000,FA2,FEM,C,0.,example_solis.eaf +20051262,20053082,FA2,FEM,C,0.,example_solis.eaf +20059248,20060742,FA2,FEM,C,0.,example_solis.eaf +20072578,20075488,FA2,FEM,C,0.,example_solis.eaf +20080464,20081904,FA2,FEM,C,0.,example_solis.eaf +20084116,20086361,FA2,FEM,C,0.,example_solis.eaf +20088718,20089846,FA2,FEM,C,0.,example_solis.eaf +30874082,30875914,FA2,FEM,C,0.,example_solis.eaf +34491376,34492275,FA2,FEM,C,0.,example_solis.eaf +34493480,34493918,FA2,FEM,N,0.,example_solis.eaf +34498204,34498983,FA2,FEM,C,0.,example_solis.eaf