Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
103 commits
Select commit Hold shift + click to select a range
8aa2032
Developed script for wrapping bacterial chromosomes
karenhx2 Oct 4, 2025
fbca683
Cleaned up files
karenhx2 Oct 4, 2025
1440b21
Merge branch 'main' into feature/karen_bacterial_wrapper
joshfactorial Oct 16, 2025
edc67b8
Worked on testing functions for stitching outputs together
karenhx2 Oct 16, 2025
ba60be7
Merge branch 'feature/karen_bacterial_wrapper' of github.com:ncsa/NEA…
karenhx2 Oct 16, 2025
541b3b1
Removed reference and data files
karenhx2 Oct 16, 2025
85a9c51
Updated script to include paired-ended runs
karenhx2 Nov 12, 2025
fdb8d2c
More error model and mutation model tests.
keshav-gandhi Nov 29, 2025
069272c
Readability updates to README.
keshav-gandhi Nov 29, 2025
9d43fa3
Full Markov integration set of scripts.
keshav-gandhi Dec 5, 2025
b539df2
Merge branch 'main' into markov-integration
keshav-gandhi Dec 5, 2025
acef491
Implemented CLI for wrapper
karenhx2 Dec 18, 2025
e75e596
Removed extra copy of runner code
karenhx2 Jan 26, 2026
313e1e8
Merge branch 'main' into markov-integration
keshav-gandhi Jan 29, 2026
a666171
Merge pull request #224 from ncsa/markov-integration
keshav-gandhi Jan 29, 2026
7d6808f
Renaming to parallel_block_size and parallel_mode; fixing tests.
keshav-gandhi Jan 30, 2026
8459c8b
Fixed bugs with config files and output stitching
karenhx2 Feb 1, 2026
55541ff
Installation instructions.
keshav-gandhi Feb 2, 2026
3fd4eb2
Merge branch 'develop' into feature/karen_bacterial_wrapper
joshfactorial Feb 4, 2026
dc28b19
Finished final debugging
karenhx2 Feb 12, 2026
aaaeed4
Accidentally removed poetry file and re-adding it
karenhx2 Feb 12, 2026
2e8e30c
Merge pull request #240 from ncsa/quality-of-life
keshav-gandhi Feb 18, 2026
ec1c70a
Merge branch 'develop' of github.com:ncsa/NEAT into feature/karen_bac…
karenhx2 Feb 22, 2026
5a4d347
Markov quality score model changes copied in here.
keshav-gandhi Feb 23, 2026
349857c
Merge branch 'develop' of github.com:ncsa/NEAT into feature/karen_bac…
karenhx2 Feb 26, 2026
4a33b46
Updated wrapper
karenhx2 Feb 26, 2026
383a4ef
Developed script for wrapping bacterial chromosomes
karenhx2 Oct 4, 2025
49ada66
Cleaned up files
karenhx2 Oct 4, 2025
7c9c546
Worked on testing functions for stitching outputs together
karenhx2 Oct 16, 2025
17a5340
Removed reference and data files
karenhx2 Oct 16, 2025
7d9798a
Updated script to include paired-ended runs
karenhx2 Nov 12, 2025
7c92f0f
Implemented CLI for wrapper
karenhx2 Dec 18, 2025
4e482af
Removed extra copy of runner code
karenhx2 Jan 26, 2026
a73ce4c
Fixed bugs with config files and output stitching
karenhx2 Feb 1, 2026
1a8dd50
Finished final debugging
karenhx2 Feb 12, 2026
1b7e179
Accidentally removed poetry file and re-adding it
karenhx2 Feb 12, 2026
625be66
Updated wrapper
karenhx2 Feb 26, 2026
0464d64
A couple of changes related to filetypes
joshfactorial Feb 26, 2026
d109128
Fixing a small error introduced by merging
joshfactorial Feb 26, 2026
be62d97
Resolved merging conflicts
karenhx2 Feb 26, 2026
b0ad46a
README updates including Markov stuff.
keshav-gandhi Feb 27, 2026
af8ba09
Removing accidental log file.
keshav-gandhi Feb 28, 2026
e94e785
Transition matrices better accounted for.
keshav-gandhi Mar 5, 2026
cfb8323
Bug fixing and cleaning up.
keshav-gandhi Mar 5, 2026
96085c0
Type bug and cleaning up.
keshav-gandhi Mar 5, 2026
015c01f
Merge branch 'markov-integration' into markov-separate
keshav-gandhi Mar 5, 2026
a026d33
Merge pull request #251 from ncsa/markov-separate
keshav-gandhi Mar 5, 2026
c1cbe3e
Merge branch 'develop' into markov-integration
keshav-gandhi Mar 5, 2026
ff13ea9
Formatting in template_neat_config.yml
keshav-gandhi Mar 5, 2026
0b69f8d
Delete version.py (we already have a 4.3.6 and version tracker now)
keshav-gandhi Mar 5, 2026
f55f87d
Fixed pytest error with reuse splits
karenhx2 Mar 5, 2026
bb2dba9
merge conflict resolution
joshfactorial Mar 25, 2026
cd1d3be
Resolved merge conflict
karenhx2 Mar 28, 2026
c1205da
Resolved merge conflicts
karenhx2 Mar 28, 2026
1465517
updating tests
joshfactorial Apr 4, 2026
f420778
Adding tests too will add more in a separate branch
joshfactorial Apr 5, 2026
2d28f67
Merge pull request #258 from ncsa/feature/fix-coverage-calculation
joshfactorial Apr 5, 2026
9456184
Fix WP genotype condition always evaluating to False in vcf_func.py
joshfactorial Apr 5, 2026
b5af726
Fix probability_rates mismatch with local_mut_regions in generate_var…
joshfactorial Apr 5, 2026
7576e11
Fix remove_variant to use position1 instead of position
joshfactorial Apr 5, 2026
570e555
Fix check_if_ins to pass position1 int to Insertion.contains()
joshfactorial Apr 5, 2026
0be5cfd
Merge pull request #259 from ncsa/fix/contig-variants-check-if-ins
joshfactorial Apr 6, 2026
f5411de
Fix variable shadowing in WP genotype parsing blocks; add regression …
joshfactorial Apr 6, 2026
e16020a
Fix intersect_regions algorithm and None-rate handling; add regressio…
joshfactorial Apr 6, 2026
a1477b8
Fix infinite loop when contig is shorter than read_len
joshfactorial Apr 6, 2026
dae00c1
Merge pull request #264 from ncsa/fix/generate-reads-contig-shorter-t…
joshfactorial Apr 7, 2026
46d96fd
Merge pull request #260 from ncsa/fix/contig-variants-remove-variant
joshfactorial Apr 7, 2026
4f09fbe
Merge pull request #261 from ncsa/fix/vcf-wp-genotype-condition
joshfactorial Apr 7, 2026
6bed2ec
Merge branch 'develop' into feature/karen_bacterial_wrapper
joshfactorial Apr 8, 2026
ea1b1a0
Merge branch 'feature/karen_bacterial_wrapper' of github.com:ncsa/NEA…
karenhx2 Apr 10, 2026
0f0bf1b
changes to find duplicates function
karenhx2 Apr 10, 2026
3d4a7c8
Merge pull request #262 from ncsa/fix/generate-variants-probability-r…
joshfactorial Apr 18, 2026
d3014eb
Add comprehensive unit tests for read simulator utilities
joshfactorial Apr 5, 2026
2ae7023
Add unit tests for generate_variants module
joshfactorial Apr 5, 2026
72e029f
Expand .gitignore with standard Python project entries
joshfactorial Apr 5, 2026
5b31bb1
Add unit tests for stitch_outputs module (100% coverage)
joshfactorial Apr 5, 2026
d485863
Add unit and integration tests for runner module
joshfactorial Apr 5, 2026
7725d18
Add unit tests for OutputFileWriter (81–95% coverage)
joshfactorial Apr 5, 2026
e4ec28c
Add tests for error_models and single_runner (58 tests)
joshfactorial Apr 5, 2026
3df09dd
Add tests for indel errors, BAM path, runner options, and variant types
joshfactorial Apr 5, 2026
25d92f6
Add targeted tests for generate_variants, error_models, and vcf_func
joshfactorial Apr 5, 2026
0bb1d33
Remove duplicate tests and fix vacuous assertions
joshfactorial Apr 5, 2026
f280af3
Add priority-1 coverage tests for uncovered source lines
joshfactorial Apr 5, 2026
3dce75f
Updating versions
joshfactorial Mar 2, 2026
cc549dc
1. Update README
alermol Mar 7, 2026
7c0c852
Tests final final_final
joshfactorial Apr 18, 2026
265d4e8
Added neat log isolation so it didn't keep writing test logs into the…
joshfactorial Apr 18, 2026
cb4bde9
Merge pull request #263 from ncsa/feature/claude-assisted-tests
joshfactorial Apr 18, 2026
670bc10
Merge branch 'main' into develop
joshfactorial Apr 18, 2026
ce60026
Solving VCF-related issues.
keshav-gandhi Apr 26, 2026
9cd65cc
Merge branch 'develop' into feature/karen_bacterial_wrapper
joshfactorial Apr 27, 2026
60ea4fd
Merge pull request #237 from ncsa/feature/karen_bacterial_wrapper
joshfactorial Apr 27, 2026
ead3e07
Merge pull request #239 from ncsa/markov-integration
joshfactorial Apr 27, 2026
342356c
Merge pull request #267 from ncsa/vcf-fixes
joshfactorial Apr 27, 2026
8cc93e4
Fix OutputFileWriter crash when produce_fastq=false and only BAM outp…
joshfactorial Apr 27, 2026
cce0e82
Merge pull request #268 from ncsa/fix/bam-only-output
joshfactorial Apr 27, 2026
5119e05
Updating version in README.md.
keshav-gandhi Apr 27, 2026
1ba5320
Revised README for NEAT 4.4.
keshav-gandhi Apr 28, 2026
ec53e9b
Add Markov quality model test coverage and fix invalid test data
joshfactorial Apr 29, 2026
7302162
Merge pull request #269 from ncsa/update-readme
joshfactorial Apr 30, 2026
68a7126
found an off-by-one bug and added claude-assisted tests
joshfactorial May 1, 2026
9fecb38
Updating code to prevent multi-allelic variants
joshfactorial May 1, 2026
f7beb1e
Merge pull request #270 from ncsa/test/markov-coverage
keshav-gandhi May 1, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 26 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,6 +1,31 @@
# Ignore filetypes
*.pyc
*.pyo
*.pyd
__pycache__/

# Virtual environments
/python2env/
/.venv/
/venv/
/env/

# IDEs
/.ipynb_checkpoints/
/.vscode/
/.idea/
/.idea/

# Test & coverage artifacts
.coverage
.coverage.*
htmlcov/
.pytest_cache/

# NEAT log files
*.log

# Build / packaging
dist/
build/
*.egg-info/
*.egg
22 changes: 11 additions & 11 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
# The NEAT Project v4.3.6
# The NEAT Project v4.4

Welcome to the NEAT project, the NExt-generation sequencing Analysis Toolkit, version 4.3.6. This release of NEAT 4.3.5 includes several fixes and a little bit of restructuring, including a parallel process for running `neat read-simulator`. Our tests show much improved performance. If the logs seem excessive, you might try using the `--log-level ERROR` to reduce the output from the logs. See the [ChangeLog](ChangeLog.md) for notes. NEAT 4.3.5 is the official release of NEAT 4.0. It represents a lot of hard work from several contributors at NCSA and beyond. With the addition of parallel processing, we feel that the code is ready for production, and future releases will focus on compatibility, bug fixes, and testing. Future releases for the time being will be enumerations of 4.3.X.
Welcome to the NEAT project, the NExt-generation sequencing Analysis Toolkit, version 4.4. NEAT 4.4 is the official release of NEAT 4.0. It represents a lot of hard work from several contributors at NCSA and beyond. With the addition of parallel processing, we feel that the code is ready for production, and future releases will focus on compatibility, bug fixes, and testing. Future releases for the time being will be enumerations of 4.4.X.

## NEAT v4.3.5
## NEAT v4.4

NEAT 4.3.5 marked the officially 'complete' version of NEAT 4.3, implementing parallelization. To add parallelization to your run, simply add the `threads` parameter in your configuration file and run `read-simulator` as normal. NEAT will take care of the rest. You can customize the parameters in your configuration file, as needed.
NEAT 4.4 fixes a few bugs related to NEAT. This release of NEAT includes several fixes to bugs and a little bit of restructuring, including more options for quality score modeling, a bacterial genome wrapper, additional tests, and more. Our tests show much improved performance. If the logs seem excessive, you might try using the `--log-level ERROR` to reduce the output from the logs. See the [ChangeLog](ChangeLog.md) for notes.

We have completed major revisions on NEAT since 3.4 and consider NEAT 4.3.5 to be a stable release, in that we will continue to update and provide bug fixes and support. We will consider new features and pull requests. Please include justification for major changes. See [contribute](CONTRIBUTING.md) for more information. If you'd like to use some of our code in your own, no problem! Just review the [license](LICENSE.md), first.
We have completed major revisions on NEAT since 3.4 and consider NEAT 4.4 to be a stable release, in that we will continue to update and provide bug fixes and support. We will consider new features and pull requests. Please include justification for major changes. See [contribute](CONTRIBUTING.md) for more information. If you'd like to use some of our code in your own, no problem! Just review the [license](LICENSE.md), first.

We've deprecated NEAT's command-line interface options for the most part, opting to simplify things with configuration files. If you require the CLI for legacy purposes, NEAT 3.4 was our last release to be fully supported via command-line interface. Please convert your CLI commands to the corresponding configuration file for future runs.

Expand All @@ -22,8 +22,8 @@ To cite this work, please use:

## Table of Contents

* [The NEAT Project v4.3.6](#the-neat-project-v436)
* [NEAT v4.3.5](#neat-v435)
* [The NEAT Project v4.4](#the-neat-project-v436)
* [NEAT v4.4](#neat-v435)
* [Table of Contents](#table-of-contents)
* [Prerequisites](#prerequisites)
* [Installation](#installation)
Expand Down Expand Up @@ -246,7 +246,7 @@ Features:

### Estimated runtimes

To give users a sense of how long `neat read-simulator` runs may take, we benchmarked NEAT 4.3.5 on several reference genomes. All runs were paired-end, with read length of 150 bp, coverage of 10, fragment mean of 300 bp, and fragment standard deviation of 50 bp. Runtimes are reported as the average across three unique runs (`Avg. time (ms)`) and the corresponding runtime in minutes. Cells marked with N/A indicate that NEAT was not able to run to completion.
To give users a sense of how long `neat read-simulator` runs may take, we benchmarked NEAT 4.4 on several reference genomes. All runs were paired-end, with read length of 150 bp, coverage of 10, fragment mean of 300 bp, and fragment standard deviation of 50 bp. Runtimes are reported as the average across three unique runs (`Avg. time (ms)`) and the corresponding runtime in minutes. Cells marked with N/A indicate that NEAT was not able to run to completion.

Benchmarks were run on a System76 Meerkat with a 13th Gen Intel Core i3-1315U (8 logical cores, up to 4.50 GHz) and 16 GiB RAM, using a 512 GB SSD and Ubuntu 24.04.3 LTS (Linux kernel 6.14). Actual runtimes will vary depending on your hardware.

Expand Down Expand Up @@ -440,7 +440,7 @@ neat gen-mut-model reference.fa input_variants.vcf \
-o /home/me/models
```

Trinucleotides are identified in the reference genome and the variant file. The mutation model uses trinucleotide context and selects mutation sites and alternate alleles with a transition matrix. Frequencies of each trinucleotide transition are calculated and output as a pickle file. Mutations are simulated to reflect the same context-dependent biases as the training data. In NEAT 4.3.5, we have only made minor optimizations to improve the speed, and the underlying statistical models are similar to those described in the original NEAT manuscript.
Trinucleotides are identified in the reference genome and the variant file. The mutation model uses trinucleotide context and selects mutation sites and alternate alleles with a transition matrix. Frequencies of each trinucleotide transition are calculated and output as a pickle file. Mutations are simulated to reflect the same context-dependent biases as the training data. As of NEAT 4.4, we have only made minor optimizations to improve the speed, and the underlying statistical models are similar to those described in the original NEAT manuscript.

| Option | Description |
|-----------------|-------------------------------------------------------------------------------|
Expand Down Expand Up @@ -510,7 +510,7 @@ Finally, `-o` is the output directory for the model file and `-p` is the prefix

### `neat vcf_compare`

Tool for comparing VCF files (Not yet implemented in NEAT 4.3.5).
Tool for comparing VCF files (Not yet implemented in NEAT 4.4).

```bash
neat vcf_compare
Expand Down Expand Up @@ -546,4 +546,4 @@ pytest -q tests
Please see `CONTRIBUTING.md` for more information and further instructions.

### Note on Sensitive Patient Data
ICGC's "Access Controlled Data" documentation can be found at <a href = https://docs.icgc.org/portal/access/ target="_blank">https://docs.icgc.org/portal/access/</a>. To have access to controlled germline data, a DACO must be submitted. Open tier data can be obtained without a DACO, but germline alleles that do not match the reference genome are masked and replaced with the reference allele. Controlled data includes unmasked germline alleles.
ICGC's "Access Controlled Data" documentation can be found at <a href = https://docs.icgc.org/portal/access/ target="_blank">https://docs.icgc.org/portal/access/</a>. To have access to controlled germline data, a DACO must be submitted. Open tier data can be obtained without a DACO, but germline alleles that do not match the reference genome are masked and replaced with the reference allele. Controlled data includes unmasked germline alleles.
9 changes: 4 additions & 5 deletions config_template/template_neat_config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -133,8 +133,7 @@ rng_seed: .
# type: int | required = no
min_mutations: .

# Overwrite the output files, if they are named the same as the current run.
# Default is to quit if files already exist to avoid data destruction
# Overwrite output files if they already exist
# type: bool | required = no | default = false
overwrite_output: .

Expand All @@ -153,12 +152,12 @@ parallel_block_size: .
threads: .

# Delete the 'splits' directory after stitching completes
# Note if threads == 1, this option has no effect.
# Note: If threads == 1, this option has no effect.
# type = bool | required: no | default = true
cleanup_splits: .

# Reuse existing files in '<out_dir>/splits' and skip the split step.
# The directory must contain NEAT-generated files and must be in the output directory within "splits"
# Note if threads == 1, this option has no effect.
# Note: If threads == 1, this option has no effect.
# type = bool | required: no | default = False
reuse_splits: .
reuse_splits: .
4 changes: 4 additions & 0 deletions neat/bacterial_wrapper/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
"""
Load modules needed for other parts of the program
"""
from .runner import *
203 changes: 203 additions & 0 deletions neat/bacterial_wrapper/runner.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,203 @@
import subprocess
import gzip
import shutil
import yaml
import pysam
import unittest
import os

from pathlib import Path
from typing import List
from Bio import bgzf
from Bio.bgzf import BgzfWriter, BgzfReader


# Rearranges the bacterial chromosome by wrapping it around

def wrapper(seq):
length = len(seq)

if (length % 2 == 0):
half_index = length // 2
else:
half_index = (length // 2) + 1

first_half = seq[:half_index]
second_half = seq[half_index:]

new_seq = second_half + first_half

return new_seq


# Writes the newly rearranged chromosome's sequence to a new fasta file

def write_fasta_file(new_seq, bacteria_name, fasta_header, output_dir_path, type):
fasta_file_name = f"{type}_{bacteria_name}.fna"
fasta_file_path = output_dir_path / fasta_file_name
fasta_file = open(fasta_file_path, "w")

fasta_file.write(fasta_header + "\n" + new_seq)

fasta_file.close()

return fasta_file_path


# Writes a yml configuration file for the newly rearranged chromosome's fasta sequence
# Splits the coverage in half for the reference and new config files
# These use default values for all other parameters for NEAT

def write_config_file(ref_config_file, rearranged_seq_file, orig_seq_file, bacteria_name, output_dir_path):
new_config_file_name = f"new_{bacteria_name}_config_test.yml"
old_config_file_name = f"{bacteria_name}_config_test.yml"

new_config_file_path = output_dir_path / new_config_file_name
old_config_file_path = output_dir_path / old_config_file_name

with open(ref_config_file, 'r') as ref_file, open(new_config_file_path, 'w') as new_file, open(old_config_file_path, 'w') as old_file:
for line in ref_file:
if line.find("reference:") != -1:
new_file.write(f"reference: {rearranged_seq_file}\n")
old_file.write(f"reference: {orig_seq_file}\n")
# elif line.find("coverage:") != -1:
# if line.strip() == "coverage: .":
# new_coverage = 5.0
# else:
# new_coverage = float((line.split(" "))[1].strip()) // 2

# new_file.write(f"coverage: {new_coverage}\n")
# old_file.write(f"coverage: {new_coverage}\n")
else:
new_file.write(line)
old_file.write(line)


ref_file.close()
new_file.close()
old_file.close()

return old_config_file_path, new_config_file_path


# Runs the NEAT read simulator using the given config file

def run_neat(config_file, output_dir, prefix):
subprocess.run(["neat", "read-simulator", "-c", config_file, "-o", output_dir + "/" + prefix])


# General function for bacterial wrapper that calls all of the functions defined above

def bacterial_wrapper(reference_file, bacteria_name, ref_config_file, output_dir):

orig_seq = ""

f = open(reference_file)
fasta_header = f.readline().strip()

plasmids = False

for line in f:
if line[0] != ">":
orig_seq += line.strip()
elif line.lower().find("plasmid") != -1: # exclude plasmids from the sequence to be rearranged
plasmids = True
break

f.close()

output_dir_path = Path(output_dir)

rearranged_seq = wrapper(orig_seq)
rearranged_seq_file = write_fasta_file(rearranged_seq, bacteria_name, fasta_header, output_dir_path, "wrapped")

orig_seq_file = reference_file
if plasmids:
orig_seq_file = write_fasta_file(orig_seq, bacteria_name, fasta_header, output_dir_path, "orig")

config_files = write_config_file(ref_config_file, rearranged_seq_file, orig_seq_file, bacteria_name, output_dir_path)
old_config_file = config_files[0]
new_config_file = config_files[1]

run_neat(old_config_file, output_dir, "Regular")
run_neat(new_config_file, output_dir, "Wrapped")


# Stitching all outputs together - Keshav's script

def concat_fq(input_files: List[Path], dest: Path) -> None:

if not input_files:
# Nothing to do, and no error to throw
return

with gzip.open(dest, 'wt') as out_f:
for input_file in input_files:
with gzip.open(input_file, 'rt') as in_f:
shutil.copyfileobj(in_f, out_f)

def merge_bam(bams: List[Path], dest: Path, threads: int) -> None:

if not bams:
return

unsorted = dest.with_suffix(".unsorted.bam")
pysam.merge("--no-PG", "-@", str(threads), "-f", str(unsorted), *map(str, bams))
pysam.sort("-@", str(threads), "-o", str(dest), str(unsorted))
unsorted.unlink(missing_ok=True)

def merge_vcf(vcfs: List[Path], dest: Path) -> None:
if not vcfs:
return

first, *rest = vcfs
shutil.copy(first, dest)

with dest.open("ab") as out_f:
for vcf in rest:
with vcf.open("rb") as fh:
for line in fh:
if not line.startswith(b"#"):
out_f.write(line)

def stitch_all_outputs(files: List[Path], output_dir) -> None:
fq1_list = []
fq2_list = []
vcf_list = []
bam_list = []

for file in files:
file_name = file.stem # use stem to differentiate fq1 and fq2
suffixes = file.suffixes # use suffixes to catch vcf and bam files

if "r2.fastq" in file_name:
fq2_list.append(file)
elif "r1.fastq" in file_name or ".fastq" in suffixes:
fq1_list.append(file)
elif ".vcf" in suffixes and ".tbi" not in suffixes:
vcf_list.append(file)
elif ".bam" in suffixes and ".bai" not in suffixes:
bam_list.append(file)

dest_fq1 = Path(f"{output_dir}/stitched_fq1.gz")
dest_bam = Path(f"{output_dir}/stitched.bam")
dest_vcf = Path(f"{output_dir}/stitched.vcf")

concat_fq(fq1_list, dest_fq1)

if (fq2_list):
dest_fq2 = Path(f"{output_dir}/stitched_fq2.gz")
concat_fq(fq2_list, dest_fq2)

merge_bam(bam_list, dest_bam, 2)
merge_vcf(vcf_list, dest_vcf)


# Testing functions

class TestWrapper(unittest.TestCase):
def test_even(self):
self.assertEqual(wrapper("ABBCBB"), "CBBABB")

def test_odd(self):
self.assertEqual(wrapper("ABBCBBC"), "BBCABBC")
3 changes: 2 additions & 1 deletion neat/cli/commands/__init__.py
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
"""Modules related to the subcommands' interfaces"""
"""Modules related to the subcommands"""

from .base import *
Loading
Loading