ArraySplitter 1.3.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,54 @@
1
+ #!/usr/bin/env python
2
+ # -*- coding: utf-8 -*-
3
+ #
4
+ # @created: 21.02.2024
5
+ # @author: Aleksey Komissarov
6
+ # @contact: ad3002@gmail.com
7
+
8
+ from collections import Counter
9
+ import argparse
10
+ import logging
11
+ from .core_functions.io.fasta_reader import sc_iter_fasta_file
12
+
13
+ logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
14
+
15
+ def main(fasta_file, output_prefix, distance=0, function='hd'):
16
+
17
+ if distance < 0:
18
+ raise ValueError(f'Distance should be >= 0, but {distance} given')
19
+
20
+ if function not in ['hd', 'ed']:
21
+ raise ValueError(f'Function should be hd or ed, but {function} given')
22
+
23
+ logging.info(f'Extract monomers from {fasta_file}')
24
+ monomers = Counter()
25
+ for header, seq in sc_iter_fasta_file(fasta_file):
26
+ for monomer in seq.split():
27
+ monomers[monomer] += 1
28
+
29
+ logging.info(f'Found {len(monomers)} uniq monomers with total {sum(monomers.values())} monomers')
30
+
31
+ logging.info(f'Filter monomers with distance <= {distance} using {function} function')
32
+ # if function == 'hd':
33
+ # monomers = {k: v for k, v in monomers.items() if v <= distance}
34
+ # else:
35
+ # raise NotImplementedError('Edit distance is not implemented yet')
36
+ logging.info(f'Found {len(monomers)} monomers with distance <= {distance}')
37
+
38
+ output_file = f'{output_prefix}.monomers.tsv'
39
+ logging.info(f'Save monomers to {output_file}')
40
+ with open(output_file, "w") as fw:
41
+ for monomer, count in monomers.most_common(1000000000):
42
+ fw.write(f'{count}\t{len(monomer)}\t{monomer}\n')
43
+
44
+ def run_it():
45
+ parser = argparse.ArgumentParser(description='Extract monomers from array over edit distance.')
46
+ parser.add_argument('-i', '--fasta', type=str, help='Fasta file with arrays', required=True)
47
+ parser.add_argument('-o', '--output', type=str, help='Output prefix', required=True)
48
+ parser.add_argument('-f', '--function', type=str, help='Distance function hamming (hd) or edit (ed) [hd]', default='hd')
49
+ parser.add_argument('-d', '--distance', type=int, help='Distance value, you will get monomers over <= distance [0]', default=0)
50
+ args = parser.parse_args()
51
+ main(args.fasta, args.output, distance=args.distance, function=args.function)
52
+
53
+ if __name__ == '__main__':
54
+ run_it()
ArraySplitter/main.py ADDED
@@ -0,0 +1,191 @@
1
+ #!/usr/bin/env python
2
+ # -*- coding: utf-8 -*-
3
+ """
4
+ ArraySplitter - Main entry point with subcommands.
5
+ """
6
+
7
+ import argparse
8
+ import sys
9
+
10
+
11
+ def run_it():
12
+ """Main entry point with subcommands."""
13
+
14
+ parser = argparse.ArgumentParser(
15
+ description="ArraySplitter - De novo decomposition and analysis of satellite DNA arrays",
16
+ formatter_class=argparse.RawDescriptionHelpFormatter,
17
+ epilog="""
18
+ Examples:
19
+ # Split arrays into monomers (default action)
20
+ arraysplitter split -i arrays.fa -o output_prefix
21
+
22
+ # Split with predefined cuts
23
+ arraysplitter split -i arrays.fa -o output_prefix -c ATG,CGCG
24
+
25
+ # Classify arrays into families (uses .lengths file from split step)
26
+ arraysplitter classify -i output_prefix.lengths -o classification
27
+
28
+ # Rotate monomers
29
+ arraysplitter rotate -i decomposed.fa -o rotated.fa
30
+
31
+ # Extract unique monomers
32
+ arraysplitter extract -i decomposed.fa -o monomers
33
+
34
+ For help on specific commands:
35
+ arraysplitter <command> -h
36
+ """
37
+ )
38
+
39
+ subparsers = parser.add_subparsers(
40
+ dest='command',
41
+ help='Available commands'
42
+ )
43
+
44
+ # Split command (decomposition)
45
+ parser_split = subparsers.add_parser(
46
+ 'split',
47
+ help='Split arrays into monomers (decomposition)'
48
+ )
49
+ parser_split.add_argument("-i", "--input", help="Input file", required=True)
50
+ parser_split.add_argument("-o", "--output", help="Output prefix", required=True)
51
+ parser_split.add_argument(
52
+ "--format",
53
+ help="Input format: fasta, trf, satellome [fasta]",
54
+ default="fasta",
55
+ choices=["fasta", "trf", "satellome"]
56
+ )
57
+ parser_split.add_argument(
58
+ "-c", "--cuts",
59
+ help="Comma-separated list of predefined cut sequences (e.g., ATG,ATGATG)",
60
+ default=None
61
+ )
62
+ parser_split.add_argument(
63
+ "-d", "--depth",
64
+ help="Depth for hint discovery (default: 100)",
65
+ type=int,
66
+ default=100
67
+ )
68
+ parser_split.add_argument(
69
+ "-t", "--threads",
70
+ help="Number of threads (currently not used)",
71
+ type=int,
72
+ default=4
73
+ )
74
+ parser_split.add_argument(
75
+ "-v", "--verbose",
76
+ help="Verbose output",
77
+ action="store_true"
78
+ )
79
+
80
+ # Classify command
81
+ parser_classify = subparsers.add_parser(
82
+ 'classify',
83
+ help='Classify arrays into families based on decomposition patterns'
84
+ )
85
+ parser_classify.add_argument("-i", "--input", help="Input .lengths file from decomposition", required=True)
86
+ parser_classify.add_argument("-o", "--output", help="Output prefix", required=True)
87
+ parser_classify.add_argument(
88
+ "-s", "--similarity",
89
+ help="Similarity threshold for clustering (0-1, default: 0.8)",
90
+ type=float,
91
+ default=0.8
92
+ )
93
+ parser_classify.add_argument(
94
+ "-v", "--verbose",
95
+ help="Verbose output",
96
+ action="store_true"
97
+ )
98
+
99
+ # Rotate command
100
+ parser_rotate = subparsers.add_parser(
101
+ 'rotate',
102
+ help='Rotate monomers to start from the same position'
103
+ )
104
+ parser_rotate.add_argument("-i", "--fasta", help="Input FASTA file", required=True)
105
+ parser_rotate.add_argument("-o", "--output", help="Output file", required=True)
106
+ parser_rotate.add_argument(
107
+ "-s", "--start",
108
+ help="Starting kmer for rotation [None]",
109
+ default=None
110
+ )
111
+
112
+ # Extract command
113
+ parser_extract = subparsers.add_parser(
114
+ 'extract',
115
+ help='Extract and count unique monomers'
116
+ )
117
+ parser_extract.add_argument("-i", "--fasta", help="Input FASTA file", required=True)
118
+ parser_extract.add_argument("-o", "--output", help="Output prefix", required=True)
119
+ parser_extract.add_argument(
120
+ "-m", "--min",
121
+ help="Minimum monomer frequency [1]",
122
+ type=int,
123
+ default=1
124
+ )
125
+
126
+ # Parse arguments
127
+ args = parser.parse_args()
128
+
129
+ # Show help if no command specified
130
+ if not args.command:
131
+ parser.print_help()
132
+ sys.exit(0)
133
+
134
+ # Import and run the appropriate module
135
+ if args.command == 'split':
136
+ from .decompose import main as decompose_main
137
+ import os
138
+
139
+ if not os.path.isfile(args.input):
140
+ print(f"Error: Input file {args.input} not found")
141
+ sys.exit(1)
142
+
143
+ # Parse cuts if provided
144
+ predefined_cuts = args.cuts.split(',') if args.cuts else None
145
+
146
+ decompose_main(
147
+ args.input,
148
+ args.output,
149
+ args.format,
150
+ args.threads,
151
+ predefined_cuts,
152
+ args.depth,
153
+ args.verbose
154
+ )
155
+
156
+ elif args.command == 'classify':
157
+ from .classify import classify_arrays
158
+ import os
159
+
160
+ if not os.path.isfile(args.input):
161
+ print(f"Error: Input file {args.input} not found")
162
+ sys.exit(1)
163
+
164
+ if not args.input.endswith('.lengths'):
165
+ print(f"Warning: Input file should be a .lengths file from ArraySplitter decomposition")
166
+
167
+ classify_arrays(
168
+ args.input,
169
+ args.output,
170
+ similarity_threshold=args.similarity,
171
+ verbose=args.verbose
172
+ )
173
+
174
+ elif args.command == 'rotate':
175
+ from .rotate import main as rotate_main
176
+
177
+ rotate_main(args.fasta, args.output, starting_kmer=args.start)
178
+
179
+ elif args.command == 'extract':
180
+ from .extract import main as extract_main
181
+
182
+ extract_main(args.fasta, args.output, min_tf=args.min)
183
+
184
+ else:
185
+ print(f"Error: Unknown command '{args.command}'")
186
+ parser.print_help()
187
+ sys.exit(1)
188
+
189
+
190
+ if __name__ == "__main__":
191
+ run_it()
@@ -0,0 +1,35 @@
1
+ #!/usr/bin/env python
2
+ # -*- coding: utf-8 -*-
3
+ #
4
+ # @created: 21.02.2024
5
+ # @author: Aleksey Komissarov
6
+ # @contact: ad3002@gmail.com
7
+
8
+ import argparse
9
+
10
+ from .core_functions.tools.rotation import rotate_arrays
11
+
12
+ from .core_functions.io.fasta_reader import sc_iter_fasta_file
13
+
14
+ def main(fasta_file, output_file, starting_kmer=None):
15
+
16
+ arrays = []
17
+ for ii, (header, seq) in enumerate(sc_iter_fasta_file(fasta_file)):
18
+ arrays.append(seq)
19
+
20
+ new_arrays = rotate_arrays(arrays, starting_kmer=starting_kmer)
21
+
22
+ with open(output_file, "w") as fw:
23
+ for ii, (header, seq) in enumerate(sc_iter_fasta_file(fasta_file)):
24
+ fw.write(f'>{header}\n{" ".join(new_arrays[ii])}\n')
25
+
26
+ def run_it():
27
+ parser = argparse.ArgumentParser(description='Rotate arrays to start from the same position.')
28
+ parser.add_argument('-i', '--fasta', type=str, help='Fasta file', required=True)
29
+ parser.add_argument('-o', '--output', type=str, help='Output file', required=True)
30
+ parser.add_argument('-s', '--start', type=str, help='Starting kmer for rotation [None]', default=None)
31
+ args = parser.parse_args()
32
+ main(args.fasta, args.output, starting_kmer=args.start)
33
+
34
+ if __name__ == '__main__':
35
+ run_it()
@@ -0,0 +1,272 @@
1
+ Metadata-Version: 2.4
2
+ Name: ArraySplitter
3
+ Version: 1.3.0
4
+ Summary: De Novo Decomposition of Satellite DNA Arrays into Monomers within Telomere-to-Telomere Assemblies
5
+ Home-page: https://github.com/aglabx/ArraySplitter
6
+ Author: Aleksey Komissarov
7
+ Author-email: ad3002@gmail.com
8
+ License: BSD
9
+ Classifier: Development Status :: 4 - Beta
10
+ Classifier: Environment :: Console
11
+ Classifier: Intended Audience :: Science/Research
12
+ Classifier: License :: OSI Approved :: BSD License
13
+ Classifier: Operating System :: OS Independent
14
+ Classifier: Programming Language :: Python
15
+ Classifier: Topic :: Scientific/Engineering :: Bio-Informatics
16
+ Requires-Python: >=3.6
17
+ Description-Content-Type: text/markdown
18
+ License-File: LICENSE
19
+ Requires-Dist: PyExp
20
+ Requires-Dist: editdistance
21
+ Requires-Dist: tqdm
22
+ Dynamic: author
23
+ Dynamic: author-email
24
+ Dynamic: classifier
25
+ Dynamic: description
26
+ Dynamic: description-content-type
27
+ Dynamic: home-page
28
+ Dynamic: license
29
+ Dynamic: license-file
30
+ Dynamic: requires-dist
31
+ Dynamic: requires-python
32
+ Dynamic: summary
33
+
34
+ # ArraySplitter: De Novo Decomposition of Satellite DNA Arrays
35
+
36
+ Decomposes satellite DNA arrays into monomers within telomere-to-telomere (T2T) assemblies. Ideal for analyzing centromeric and pericentromeric regions on monomeric level.
37
+
38
+ **Status:** Production ready. Successfully handles arrays from kilobase to megabase scale.
39
+
40
+ **Key Features:**
41
+ - De novo monomer identification without prior knowledge
42
+ - Automatic orientation to canonical form (A>T, C>G)
43
+ - Integrated monomer rotation for standardized comparison
44
+ - Classification of arrays into repeat families
45
+ - Structural importance scoring to identify centromeric and other functional regions
46
+
47
+ **Performance:** CHM13v2.0 assembly (13K arrays > 1Kb) processes in ~3 hours (single-threaded)
48
+
49
+ ## Installation
50
+
51
+ **Prerequisites**
52
+
53
+ * Python 3.6 or later
54
+
55
+ **Installation with pip:**
56
+
57
+ ```bash
58
+ pip install arraysplitter
59
+ ```
60
+
61
+ ## Tool Overview
62
+
63
+ ArraySplitter provides a unified command-line interface with multiple subcommands:
64
+
65
+ ### Main Command: `arraysplitter`
66
+
67
+ ```bash
68
+ arraysplitter <command> [options]
69
+ ```
70
+
71
+ Available commands:
72
+ - `split` - Decompose arrays into monomers
73
+ - `classify` - Group arrays into families based on patterns
74
+ - `rotate` - Normalize monomer orientation
75
+ - `extract` - Extract and count unique monomers
76
+
77
+ ### 1. `arraysplitter split` - Array Decomposition
78
+
79
+ Performs de novo decomposition of satellite DNA arrays into individual monomers.
80
+
81
+ **Usage:**
82
+ ```bash
83
+ # Basic decomposition
84
+ arraysplitter split -i arrays.fa -o output_prefix
85
+
86
+ # With predefined cut sequences
87
+ arraysplitter split -i arrays.fa -o output_prefix -c ATG,CGCG
88
+ ```
89
+
90
+ **Output files:**
91
+ - `.decomposed.fasta` - Monomers with orientation and rotation applied
92
+ - `.monomers.tsv` - Detailed table with monomer information
93
+ - `.lengths` - Fragment lengths for each array
94
+
95
+ **Features:**
96
+ - Automatic canonical orientation (A>T, C>G)
97
+ - Integrated rotation (monomers start with cut sequence)
98
+ - Flank detection and labeling
99
+ - Perfect reconstruction guarantee
100
+
101
+ ### 2. `arraysplitter classify` - Family Classification
102
+
103
+ Groups arrays into families based on cut sequences and decomposition patterns. Identifies structurally important regions.
104
+
105
+ **Usage:**
106
+ ```bash
107
+ # Classify using lengths file from split step
108
+ arraysplitter classify -i output_prefix.lengths -o classification
109
+
110
+ # With custom similarity threshold
111
+ arraysplitter classify -i output_prefix.lengths -o classification -s 0.9
112
+ ```
113
+
114
+ **Output files:**
115
+ - `.families.tsv` - Array assignments with stability metrics
116
+ - `.family_stats.tsv` - Basic statistics per family
117
+ - `.family_summary.tsv` - Detailed family analysis with structural importance scores
118
+ - `.features.json` - Complete feature data
119
+
120
+ **Key metrics:**
121
+ - **Step stability**: Consistency of monomer length differences
122
+ - **Local variability**: Sliding window analysis (10kb windows)
123
+ - **Structural importance score**: Combined metric (0-1) identifying potential functional regions
124
+
125
+ ### 3. `arraysplitter rotate` - Monomer Normalization
126
+
127
+ Rotates monomers to start with the same sequence pattern.
128
+
129
+ **Usage:**
130
+ ```bash
131
+ # Auto-detect best rotation
132
+ arraysplitter rotate -i monomers.fa -o rotated.fa
133
+
134
+ # With specific starting sequence
135
+ arraysplitter rotate -i monomers.fa -o rotated.fa -s ATTCC
136
+ ```
137
+
138
+ ### 4. `arraysplitter extract` - Monomer Analysis
139
+
140
+ Extracts unique monomers and calculates frequencies.
141
+
142
+ **Usage:**
143
+ ```bash
144
+ arraysplitter extract -i monomers.fa -o stats_prefix
145
+ ```
146
+
147
+ **Output format:**
148
+ ```
149
+ <length> <frequency> <sequence>
150
+ ```
151
+
152
+ ## Complete Workflow Example
153
+
154
+ ```bash
155
+ # Step 1: Decompose arrays into monomers
156
+ arraysplitter split -i centromere_arrays.fa -o centromere
157
+
158
+ # Step 2: Classify arrays into families and identify structural regions
159
+ arraysplitter classify -i centromere.lengths -o centromere_families
160
+
161
+ # Step 3: Extract and count unique monomers (optional)
162
+ arraysplitter extract -i centromere.decomposed.fasta -o centromere_monomers
163
+
164
+ # Step 4: Additional rotation if needed (optional)
165
+ arraysplitter rotate -i centromere.decomposed.fasta -o centromere.rotated.fa -s ATTCC
166
+ ```
167
+
168
+ ### Output Analysis
169
+
170
+ After classification, examine the `.family_summary.tsv` file to identify:
171
+ - Families with high structural importance scores (>0.8) - potential centromeric regions
172
+ - Families with low step variability - structurally conserved regions
173
+ - Most stable arrays within each family - best representatives for further study
174
+
175
+ ## Algorithm Description
176
+
177
+ ArraySplitter employs a novel de novo algorithm for decomposing satellite DNA arrays into constituent monomers without prior knowledge of the monomer sequences. The algorithm is specifically designed to handle the challenges of centromeric and pericentromeric regions in telomere-to-telomere assemblies.
178
+
179
+ ### Overview
180
+
181
+ The algorithm uses a frequency suffix tree (fs_tree) approach to identify optimal cut sequences that split tandem repeat arrays into individual monomer units. It handles variable-length monomers (polymorphic repeats) common in biological sequences and automatically orients sequences to canonical form for comparability.
182
+
183
+ ### Detailed Algorithm Steps
184
+
185
+ #### 1. Canonical Orientation
186
+ Arrays are first oriented to canonical form using the rules:
187
+ - Primary: A > T (arrays with more A's than T's are kept as-is)
188
+ - Secondary: C > G (if A=T, arrays with more C's than G's are kept as-is)
189
+ - Arrays not in canonical form are reverse complemented
190
+
191
+ #### 2. All Nucleotide Analysis
192
+ The algorithm analyzes all nucleotides (A, C, T, G) to avoid bias from single nucleotide selection. Each nucleotide serves as an anchor point for building frequency suffix trees.
193
+
194
+ #### 3. Frequency Suffix Tree Construction
195
+ The core data structure is a frequency suffix tree that efficiently identifies repetitive patterns:
196
+
197
+ - **Starting positions**: All positions containing each nucleotide become root nodes
198
+ - **Iterative extension**: The tree grows by extending sequences one nucleotide at a time (A/C/G/T)
199
+ - **Frequency filtering**: Only branches exceeding a dynamic cutoff threshold are retained:
200
+ - Arrays > 1MB: cutoff = 1000
201
+ - Arrays > 100KB: cutoff = 250
202
+ - Arrays > 10KB: cutoff = 10
203
+ - Arrays ≤ 10KB: cutoff = 3
204
+ - **Heap-based optimization**: Uses a priority queue to efficiently process high-frequency patterns first
205
+
206
+ #### 4. Candidate Cut Sequence Generation
207
+ From the frequency suffix tree, the algorithm extracts potential cut sequences:
208
+ - For each sequence length (up to a configurable depth, default 100)
209
+ - Identifies the sequence with maximum coverage (highest frequency)
210
+ - Generates a ranked list of candidate cut sequences
211
+
212
+ #### 5. Optimal Cut Selection
213
+ The algorithm evaluates each candidate cut sequence by:
214
+ - Splitting the array at all occurrences of the cut sequence
215
+ - Calculating period distribution between cuts
216
+ - Handling perfect/near-perfect repeats (≥80% empty parts between cuts)
217
+ - Computing scores with tie-breaking rules:
218
+ 1. Prefer cuts producing fewer segments
219
+ 2. Prefer smaller fundamental periods (using GCD)
220
+ - The cut sequence becomes the START of each monomer (biologically relevant)
221
+
222
+ #### 6. Monomer Construction
223
+ - First fragment (before any cut) is treated as left flank
224
+ - Each monomer is built as: cut_sequence + following_part
225
+ - Last fragment <70% of average length is treated as right flank
226
+ - All monomers are automatically rotated to start with the cut sequence
227
+ - Ensures all output monomers are directly comparable
228
+
229
+ ### Key Features
230
+
231
+ 1. **De novo approach**: No prior knowledge of monomer sequences required
232
+ 2. **Variable-length monomers**: Handles polymorphic repeats naturally
233
+ 3. **Canonical orientation**: All arrays oriented consistently (A>T, C>G)
234
+ 4. **Integrated rotation**: Monomers automatically aligned to cut sequence
235
+ 5. **Family classification**: Groups arrays by cut patterns and variability
236
+ 6. **Structural scoring**: Identifies centromeric and functional regions
237
+
238
+ ### Performance Characteristics
239
+
240
+ - **Optimized for**: 100Kb scale arrays
241
+ - **Scalability**: Successfully handles megabase-scale arrays (largest ~5 minutes)
242
+ - **Benchmarking**: CHM13v20 assembly (13K arrays > 1Kb) processes in ~3 hours
243
+ - **Current limitation**: Single-threaded (parallelization planned)
244
+
245
+ ### Classification Algorithm
246
+
247
+ ArraySplitter includes a classification system that groups arrays into families based on:
248
+
249
+ 1. **Cut sequence identity**: Arrays with different cuts belong to different families
250
+ 2. **Pattern similarity**: Within same cut, arrays are clustered by:
251
+ - Mean monomer length
252
+ - Length variability
253
+ - Step stability (consistency between consecutive monomers)
254
+ 3. **Structural importance scoring**:
255
+ - High step stability (consistent monomer spacing)
256
+ - Low local variability (stable regions in 10kb windows)
257
+ - Consistency across arrays in family
258
+ - Score 0-1 (higher = more structurally important)
259
+
260
+ ### Applications
261
+
262
+ The algorithm is particularly well-suited for:
263
+ - Analyzing centromeric and pericentromeric regions in T2T assemblies
264
+ - Identifying structurally important genomic regions
265
+ - Studying satellite DNA evolution and variation
266
+ - Discovering novel tandem repeat families
267
+ - Quantifying monomer composition and variability
268
+ - Finding stable regions for functional studies
269
+
270
+ ## Contact
271
+
272
+ For questions or support: ad3002@gmail.com
@@ -0,0 +1,27 @@
1
+ ArraySplitter/__init__.py,sha256=h8Fz1eD4MXGpCgKpn1RqfA_t7dfCg6O8Vx0ysxCMdHE,169
2
+ ArraySplitter/classify.py,sha256=9OkmGecGvEa40mmIK4BPblVpuRBfZFS7oWbkETJ2idQ,21023
3
+ ArraySplitter/decompose.py,sha256=Voqcwgquy6-lSnVjusjPrKiszxG5x0SIhmjrtGCTVvo,70530
4
+ ArraySplitter/extract.py,sha256=bqlC8E6MjndMCBa44Zvv23gXmH2yr7IdQBXnc5foqhM,2300
5
+ ArraySplitter/main.py,sha256=GTOI6Ca38-Ws_a127MbLtPnSzKPBKrDFHS48_1Tey54,5709
6
+ ArraySplitter/rotate.py,sha256=ZvH2WDnRlfeqbXtUDmrgqE2CQEGe5qKDVR-my_uKkLA,1231
7
+ ArraySplitter/core_functions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
+ ArraySplitter/core_functions/io/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
+ ArraySplitter/core_functions/io/block_file.py,sha256=AI7HVxUFAhLSw7-G1hHORShemyGO1-FpfohDKbOV1Ug,4764
10
+ ArraySplitter/core_functions/io/fasta_reader.py,sha256=ivG-2aPBPxSh5WkcWgZUDyrQrGq8uOBiakGUu1eC6zg,1388
11
+ ArraySplitter/core_functions/io/satellome_reader.py,sha256=E7aBxrpF2SMPF3tKMZpNBmTCKkjjIZCF0Cnlpo1bES8,559
12
+ ArraySplitter/core_functions/io/tab_file.py,sha256=TcmO0iKf5mNoCbuQbR3ZQKXV5Xsc8kr6dhk8C8FDMlw,6231
13
+ ArraySplitter/core_functions/io/trf_reader.py,sha256=L7HL2mfxQAA2gBsksFj7EJSZIt4JZ0ENKaub7CFSo8A,2111
14
+ ArraySplitter/core_functions/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
15
+ ArraySplitter/core_functions/models/trf_model.py,sha256=hK44KXf8fdcfS__i5UmvOr4xnh-AeWeVhvXiINnOqXc,8012
16
+ ArraySplitter/core_functions/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
17
+ ArraySplitter/core_functions/tools/anchor_graph.py,sha256=MrPbsw95dExh9HbASxnQgey_lJc8yHn7-ni-IijT0xo,23754
18
+ ArraySplitter/core_functions/tools/fs_tree.py,sha256=OHvamldtHW_7VEiWg7XiJ7Xwml2gmTACiZrGnP3WL6c,4655
19
+ ArraySplitter/core_functions/tools/parsers.py,sha256=J_rtt384ycfgrWlgrazb3qj7Sr0waWj7yShlril5rqM,6766
20
+ ArraySplitter/core_functions/tools/rotation.py,sha256=v_-3gkx8AR10RDCNMO82Pok1ZbqT2Zy9asyWZ6Ib_v8,3109
21
+ ArraySplitter/core_functions/tools/sequences.py,sha256=v74uHp1nTF_UvMRefYmJfMbnzdurRn995C06hugoSa4,441
22
+ arraysplitter-1.3.0.dist-info/licenses/LICENSE,sha256=m2dY1BxIk3gKB3jSa8kDtlSnNfW68VumXAQzGacCtvc,1063
23
+ arraysplitter-1.3.0.dist-info/METADATA,sha256=E-rQhLl9Cn-xcF9hYuuhjyXxRURf2ca8trtgd8cAa_E,10177
24
+ arraysplitter-1.3.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
25
+ arraysplitter-1.3.0.dist-info/entry_points.txt,sha256=H8EDFoNSqnM6J8m2w97H8HKjzAqs-iNTrIHk87-kfhY,60
26
+ arraysplitter-1.3.0.dist-info/top_level.txt,sha256=zk1yzRnjygCl8ZF8rx3w4WSWdW8FUw1-MqSk-s3NOHY,14
27
+ arraysplitter-1.3.0.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (80.9.0)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ arraysplitter = ArraySplitter.main:run_it
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024 aglabx
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1 @@
1
+ ArraySplitter