XspecT 0.5.3__tar.gz → 0.6.0__tar.gz

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.
Files changed (129) hide show
  1. {xspect-0.5.3 → xspect-0.6.0}/.gitignore +11 -1
  2. {xspect-0.5.3/src/XspecT.egg-info → xspect-0.6.0}/PKG-INFO +4 -1
  3. xspect-0.6.0/docs/benchmark.md +34 -0
  4. {xspect-0.5.3 → xspect-0.6.0}/docs/cli.md +13 -3
  5. {xspect-0.5.3 → xspect-0.6.0}/docs/contributing.md +4 -1
  6. {xspect-0.5.3 → xspect-0.6.0}/mkdocs.yml +3 -1
  7. {xspect-0.5.3 → xspect-0.6.0}/pyproject.toml +5 -2
  8. xspect-0.6.0/scripts/benchmark/classify/main.nf +22 -0
  9. xspect-0.6.0/scripts/benchmark/environment.yml +7 -0
  10. xspect-0.6.0/scripts/benchmark/main.nf +548 -0
  11. xspect-0.6.0/scripts/benchmark/nextflow.config +7 -0
  12. xspect-0.6.0/scripts/benchmark-data/download_data.slurm +13 -0
  13. {xspect-0.5.3 → xspect-0.6.0/src/XspecT.egg-info}/PKG-INFO +4 -1
  14. {xspect-0.5.3 → xspect-0.6.0}/src/XspecT.egg-info/SOURCES.txt +11 -0
  15. {xspect-0.5.3 → xspect-0.6.0}/src/XspecT.egg-info/requires.txt +3 -0
  16. {xspect-0.5.3 → xspect-0.6.0}/src/xspect/classify.py +38 -8
  17. {xspect-0.5.3 → xspect-0.6.0}/src/xspect/definitions.py +30 -10
  18. {xspect-0.5.3 → xspect-0.6.0}/src/xspect/file_io.py +2 -1
  19. {xspect-0.5.3 → xspect-0.6.0}/src/xspect/filter_sequences.py +20 -4
  20. {xspect-0.5.3 → xspect-0.6.0}/src/xspect/main.py +126 -28
  21. xspect-0.6.0/src/xspect/misclassification_detection/mapping.py +168 -0
  22. xspect-0.6.0/src/xspect/misclassification_detection/point_pattern_analysis.py +102 -0
  23. xspect-0.6.0/src/xspect/misclassification_detection/simulate_reads.py +55 -0
  24. {xspect-0.5.3 → xspect-0.6.0}/src/xspect/mlst_feature/mlst_helper.py +15 -19
  25. {xspect-0.5.3 → xspect-0.6.0}/src/xspect/mlst_feature/pub_mlst_handler.py +16 -19
  26. {xspect-0.5.3 → xspect-0.6.0}/src/xspect/model_management.py +14 -17
  27. {xspect-0.5.3 → xspect-0.6.0}/src/xspect/models/probabilistic_filter_mlst_model.py +11 -10
  28. {xspect-0.5.3 → xspect-0.6.0}/src/xspect/models/probabilistic_filter_model.py +142 -8
  29. {xspect-0.5.3 → xspect-0.6.0}/src/xspect/models/probabilistic_filter_svm_model.py +29 -14
  30. {xspect-0.5.3 → xspect-0.6.0}/src/xspect/models/probabilistic_single_filter_model.py +9 -7
  31. {xspect-0.5.3 → xspect-0.6.0}/src/xspect/models/result.py +22 -15
  32. {xspect-0.5.3 → xspect-0.6.0}/src/xspect/ncbi.py +82 -7
  33. {xspect-0.5.3 → xspect-0.6.0}/src/xspect/train.py +21 -4
  34. {xspect-0.5.3 → xspect-0.6.0}/src/xspect/web.py +13 -4
  35. xspect-0.6.0/tests/__init__.py +0 -0
  36. {xspect-0.5.3 → xspect-0.6.0}/tests/test_cli.py +43 -0
  37. xspect-0.6.0/tests/test_misclassification_detection.py +92 -0
  38. {xspect-0.5.3 → xspect-0.6.0}/tests/test_model_management.py +11 -17
  39. {xspect-0.5.3 → xspect-0.6.0}/tests/test_ncbi.py +53 -3
  40. {xspect-0.5.3 → xspect-0.6.0}/tests/test_web.py +12 -0
  41. {xspect-0.5.3 → xspect-0.6.0}/.github/workflows/black.yml +0 -0
  42. {xspect-0.5.3 → xspect-0.6.0}/.github/workflows/docs.yml +0 -0
  43. {xspect-0.5.3 → xspect-0.6.0}/.github/workflows/pylint.yml +0 -0
  44. {xspect-0.5.3 → xspect-0.6.0}/.github/workflows/pypi.yml +0 -0
  45. {xspect-0.5.3 → xspect-0.6.0}/.github/workflows/test.yml +0 -0
  46. {xspect-0.5.3 → xspect-0.6.0}/LICENSE +0 -0
  47. {xspect-0.5.3 → xspect-0.6.0}/README.md +0 -0
  48. {xspect-0.5.3 → xspect-0.6.0}/docs/index.md +0 -0
  49. {xspect-0.5.3 → xspect-0.6.0}/docs/quickstart.md +0 -0
  50. {xspect-0.5.3 → xspect-0.6.0}/docs/understanding.md +0 -0
  51. {xspect-0.5.3 → xspect-0.6.0}/docs/web.md +0 -0
  52. {xspect-0.5.3 → xspect-0.6.0}/setup.cfg +0 -0
  53. {xspect-0.5.3 → xspect-0.6.0}/src/XspecT.egg-info/dependency_links.txt +0 -0
  54. {xspect-0.5.3 → xspect-0.6.0}/src/XspecT.egg-info/entry_points.txt +0 -0
  55. {xspect-0.5.3 → xspect-0.6.0}/src/XspecT.egg-info/top_level.txt +0 -0
  56. {xspect-0.5.3 → xspect-0.6.0}/src/xspect/__init__.py +0 -0
  57. {xspect-0.5.3 → xspect-0.6.0}/src/xspect/download_models.py +0 -0
  58. {xspect-0.5.3/src/xspect/mlst_feature → xspect-0.6.0/src/xspect/misclassification_detection}/__init__.py +0 -0
  59. {xspect-0.5.3/src/xspect/models → xspect-0.6.0/src/xspect/mlst_feature}/__init__.py +0 -0
  60. {xspect-0.5.3/tests → xspect-0.6.0/src/xspect/models}/__init__.py +0 -0
  61. {xspect-0.5.3 → xspect-0.6.0}/src/xspect/xspect-web/.gitignore +0 -0
  62. {xspect-0.5.3 → xspect-0.6.0}/src/xspect/xspect-web/README.md +0 -0
  63. {xspect-0.5.3 → xspect-0.6.0}/src/xspect/xspect-web/components.json +0 -0
  64. {xspect-0.5.3 → xspect-0.6.0}/src/xspect/xspect-web/dist/assets/index-Ceo58xui.css +0 -0
  65. {xspect-0.5.3 → xspect-0.6.0}/src/xspect/xspect-web/dist/assets/index-Dt_UlbgE.js +0 -0
  66. {xspect-0.5.3 → xspect-0.6.0}/src/xspect/xspect-web/dist/index.html +0 -0
  67. {xspect-0.5.3 → xspect-0.6.0}/src/xspect/xspect-web/dist/vite.svg +0 -0
  68. {xspect-0.5.3 → xspect-0.6.0}/src/xspect/xspect-web/eslint.config.js +0 -0
  69. {xspect-0.5.3 → xspect-0.6.0}/src/xspect/xspect-web/index.html +0 -0
  70. {xspect-0.5.3 → xspect-0.6.0}/src/xspect/xspect-web/package-lock.json +0 -0
  71. {xspect-0.5.3 → xspect-0.6.0}/src/xspect/xspect-web/package.json +0 -0
  72. {xspect-0.5.3 → xspect-0.6.0}/src/xspect/xspect-web/pnpm-lock.yaml +0 -0
  73. {xspect-0.5.3 → xspect-0.6.0}/src/xspect/xspect-web/public/vite.svg +0 -0
  74. {xspect-0.5.3 → xspect-0.6.0}/src/xspect/xspect-web/src/App.tsx +0 -0
  75. {xspect-0.5.3 → xspect-0.6.0}/src/xspect/xspect-web/src/api.tsx +0 -0
  76. {xspect-0.5.3 → xspect-0.6.0}/src/xspect/xspect-web/src/assets/react.svg +0 -0
  77. {xspect-0.5.3 → xspect-0.6.0}/src/xspect/xspect-web/src/components/classification-form.tsx +0 -0
  78. {xspect-0.5.3 → xspect-0.6.0}/src/xspect/xspect-web/src/components/classify.tsx +0 -0
  79. {xspect-0.5.3 → xspect-0.6.0}/src/xspect/xspect-web/src/components/data-table.tsx +0 -0
  80. {xspect-0.5.3 → xspect-0.6.0}/src/xspect/xspect-web/src/components/dropdown-checkboxes.tsx +0 -0
  81. {xspect-0.5.3 → xspect-0.6.0}/src/xspect/xspect-web/src/components/dropdown-slider.tsx +0 -0
  82. {xspect-0.5.3 → xspect-0.6.0}/src/xspect/xspect-web/src/components/filter-form.tsx +0 -0
  83. {xspect-0.5.3 → xspect-0.6.0}/src/xspect/xspect-web/src/components/filter.tsx +0 -0
  84. {xspect-0.5.3 → xspect-0.6.0}/src/xspect/xspect-web/src/components/filtering-result.tsx +0 -0
  85. {xspect-0.5.3 → xspect-0.6.0}/src/xspect/xspect-web/src/components/header.tsx +0 -0
  86. {xspect-0.5.3 → xspect-0.6.0}/src/xspect/xspect-web/src/components/landing.tsx +0 -0
  87. {xspect-0.5.3 → xspect-0.6.0}/src/xspect/xspect-web/src/components/models-details.tsx +0 -0
  88. {xspect-0.5.3 → xspect-0.6.0}/src/xspect/xspect-web/src/components/models.tsx +0 -0
  89. {xspect-0.5.3 → xspect-0.6.0}/src/xspect/xspect-web/src/components/result-chart.tsx +0 -0
  90. {xspect-0.5.3 → xspect-0.6.0}/src/xspect/xspect-web/src/components/result.tsx +0 -0
  91. {xspect-0.5.3 → xspect-0.6.0}/src/xspect/xspect-web/src/components/spinner.tsx +0 -0
  92. {xspect-0.5.3 → xspect-0.6.0}/src/xspect/xspect-web/src/components/ui/accordion.tsx +0 -0
  93. {xspect-0.5.3 → xspect-0.6.0}/src/xspect/xspect-web/src/components/ui/button.tsx +0 -0
  94. {xspect-0.5.3 → xspect-0.6.0}/src/xspect/xspect-web/src/components/ui/card.tsx +0 -0
  95. {xspect-0.5.3 → xspect-0.6.0}/src/xspect/xspect-web/src/components/ui/chart.tsx +0 -0
  96. {xspect-0.5.3 → xspect-0.6.0}/src/xspect/xspect-web/src/components/ui/command.tsx +0 -0
  97. {xspect-0.5.3 → xspect-0.6.0}/src/xspect/xspect-web/src/components/ui/dialog.tsx +0 -0
  98. {xspect-0.5.3 → xspect-0.6.0}/src/xspect/xspect-web/src/components/ui/dropdown-menu.tsx +0 -0
  99. {xspect-0.5.3 → xspect-0.6.0}/src/xspect/xspect-web/src/components/ui/file-upload.tsx +0 -0
  100. {xspect-0.5.3 → xspect-0.6.0}/src/xspect/xspect-web/src/components/ui/form.tsx +0 -0
  101. {xspect-0.5.3 → xspect-0.6.0}/src/xspect/xspect-web/src/components/ui/input.tsx +0 -0
  102. {xspect-0.5.3 → xspect-0.6.0}/src/xspect/xspect-web/src/components/ui/label.tsx +0 -0
  103. {xspect-0.5.3 → xspect-0.6.0}/src/xspect/xspect-web/src/components/ui/navigation-menu.tsx +0 -0
  104. {xspect-0.5.3 → xspect-0.6.0}/src/xspect/xspect-web/src/components/ui/popover.tsx +0 -0
  105. {xspect-0.5.3 → xspect-0.6.0}/src/xspect/xspect-web/src/components/ui/select.tsx +0 -0
  106. {xspect-0.5.3 → xspect-0.6.0}/src/xspect/xspect-web/src/components/ui/separator.tsx +0 -0
  107. {xspect-0.5.3 → xspect-0.6.0}/src/xspect/xspect-web/src/components/ui/slider.tsx +0 -0
  108. {xspect-0.5.3 → xspect-0.6.0}/src/xspect/xspect-web/src/components/ui/switch.tsx +0 -0
  109. {xspect-0.5.3 → xspect-0.6.0}/src/xspect/xspect-web/src/components/ui/table.tsx +0 -0
  110. {xspect-0.5.3 → xspect-0.6.0}/src/xspect/xspect-web/src/components/ui/tabs.tsx +0 -0
  111. {xspect-0.5.3 → xspect-0.6.0}/src/xspect/xspect-web/src/index.css +0 -0
  112. {xspect-0.5.3 → xspect-0.6.0}/src/xspect/xspect-web/src/lib/utils.ts +0 -0
  113. {xspect-0.5.3 → xspect-0.6.0}/src/xspect/xspect-web/src/main.tsx +0 -0
  114. {xspect-0.5.3 → xspect-0.6.0}/src/xspect/xspect-web/src/types.tsx +0 -0
  115. {xspect-0.5.3 → xspect-0.6.0}/src/xspect/xspect-web/src/utils.tsx +0 -0
  116. {xspect-0.5.3 → xspect-0.6.0}/src/xspect/xspect-web/src/vite-env.d.ts +0 -0
  117. {xspect-0.5.3 → xspect-0.6.0}/src/xspect/xspect-web/tsconfig.app.json +0 -0
  118. {xspect-0.5.3 → xspect-0.6.0}/src/xspect/xspect-web/tsconfig.json +0 -0
  119. {xspect-0.5.3 → xspect-0.6.0}/src/xspect/xspect-web/tsconfig.node.json +0 -0
  120. {xspect-0.5.3 → xspect-0.6.0}/src/xspect/xspect-web/vite.config.ts +0 -0
  121. {xspect-0.5.3 → xspect-0.6.0}/tests/conftest.py +0 -0
  122. {xspect-0.5.3 → xspect-0.6.0}/tests/test_file_io.py +0 -0
  123. {xspect-0.5.3 → xspect-0.6.0}/tests/test_model_result.py +0 -0
  124. {xspect-0.5.3 → xspect-0.6.0}/tests/test_probabilisitc_filter_mlst_model.py +0 -0
  125. {xspect-0.5.3 → xspect-0.6.0}/tests/test_probabilistic_filter_model.py +0 -0
  126. {xspect-0.5.3 → xspect-0.6.0}/tests/test_probabilistic_filter_svm_model.py +0 -0
  127. {xspect-0.5.3 → xspect-0.6.0}/tests/test_probabilistic_single_filter_model.py +0 -0
  128. {xspect-0.5.3 → xspect-0.6.0}/tests/test_pub_mlst_handler.py +0 -0
  129. {xspect-0.5.3 → xspect-0.6.0}/tests/test_train.py +0 -0
@@ -177,4 +177,14 @@ out.png
177
177
 
178
178
  xspect-data/
179
179
 
180
- .devcontainer/
180
+ .devcontainer/
181
+
182
+ # Nextflow
183
+ .nextflow.log*
184
+ .nextflow/
185
+ work/
186
+ data/
187
+ results/
188
+
189
+ # Slurm
190
+ slurm-*
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: XspecT
3
- Version: 0.5.3
3
+ Version: 0.6.0
4
4
  Summary: Tool to monitor and characterize pathogens using Bloom filters.
5
5
  License: MIT License
6
6
 
@@ -45,6 +45,9 @@ Requires-Dist: xxhash
45
45
  Requires-Dist: fastapi
46
46
  Requires-Dist: uvicorn
47
47
  Requires-Dist: python-multipart
48
+ Requires-Dist: mappy
49
+ Requires-Dist: pysam
50
+ Requires-Dist: numpy
48
51
  Provides-Extra: docs
49
52
  Requires-Dist: mkdocs-material; extra == "docs"
50
53
  Requires-Dist: mkdocs-include-markdown-plugin; extra == "docs"
@@ -0,0 +1,34 @@
1
+ # Benchmark
2
+
3
+ XspecT is a tool designed for fast and accurate species classification of genome assemblies and simulated reads. To evaluate its classification accuracy, we conducted a benchmark using a set of Acinetobacter genomes.
4
+
5
+ The benchmark was performed by first download all available Acinetobacter genomes from Genbank, filtered on a passed ("OK") taxonomy check status. Genomes assigned to strain IDs were remapped to their respective species IDs, after which genomes with species IDs not contained in XspecT's Acinetobacter model were removed. The remaining genomes were then used to classify both assemblies and simulated reads generated from them. Simulated reads were generated by first filtering on genomes that were not part of the training data and that were categorized as "complete" by NCBI. The reads were then simulated from the longest contig of each genome (assumed to be the chromosome) using a custom Python script. Up to three genomes were selected per species. 100 000 reads were simulated for each genome, with a read length of 100 bp and no simulated sequencing errors. The reads were then classified using XspecT with predictions based on the maximum-scoring species.
6
+
7
+ ## Benchmark Results
8
+
9
+ The benchmark results show that XspecT achieves high classification accuracy, with an overall accuracy of nearly 100% for whole genomes and 82% for simulated reads. However, the low macro-average F1 score (0.41) for the read dataset highlights a substantial class imbalance.
10
+
11
+ | Dataset | Total Samples | Matches | Mismatches | Match Rate | Mismatch Rate | Accuracy | Macro Avg F1 | Weighted Avg F1 |
12
+ |-----------|--------------:|----------:|-----------:|-----------:|--------------:|---------:|-------------:|----------------:|
13
+ | Assembly | 44,905 | 44,879 | 26 | 99.94% | 0.06% | ≈1.00 | 0.95 | 1.00 |
14
+ | Reads | 9,200,000 | 7,526,902 | 1,673,098 | 81.81% | 18.19% | 0.82 | 0.41 | 0.87 |
15
+
16
+ ## Running the benchmark yourself
17
+
18
+ To benchmark XspecT performance yourself, you can use the Nextflow workflow provided in the `scripts/benchmark` directory. This workflow allows you to run XspecT on a set of samples and measure species classification accuracy on both genome assemblies, as well as on simulated reads.
19
+
20
+ Before you run the benchmark, you first need to download benchmarking data to the `data` directory, for example from NCBI. To do so, you can use the bash script in `scripts/benchmark-data` to download the data using the [NCBI Datasets CLI](https://www.ncbi.nlm.nih.gov/datasets/docs/v2/command-line-tools/download-and-install/), which needs to be installed first. The script will download all available Acinetobacter genomes, as well as taxonomic data.
21
+
22
+ To run the benchmark, install [Nextflow](https://www.nextflow.io/docs/latest/install.html) and run the following command:
23
+
24
+ ```bash
25
+ nextflow run scripts/benchmark
26
+ ```
27
+
28
+ This will execute the benchmark workflow, which will classify the samples, as well as reads generated from them, using XspecT. The results will be saved in the `results` directory:
29
+
30
+ - `results/classifications.tsv` for the classifications of the assemblies
31
+ - `results/read_classifications.tsv` for the classifications of the simulated reads
32
+ - `results/confusion_matrix.png` for the confusion matrix of genome assembly classifications
33
+ - `results/mismatches_confusion_matrix.png` for a confusion matrix filtered on mismatches of genome assembly classifications
34
+ - `results/stats.txt` for the statistics of the benchmark run
@@ -12,7 +12,7 @@ In general, XspecT commands will prompt you for parameters if they are not provi
12
12
 
13
13
  ## Model Management
14
14
 
15
- At its core, XspecT uses models to classify and filter samples. These models are based on kmer indices trained on publicly availabel genomes as well as, possibly, a support vector machine (SVM) classifier.
15
+ At its core, XspecT uses models to classify and filter samples. These models are based on kmer indices trained on publicly available genomes as well as, possibly, a support vector machine (SVM) classifier.
16
16
 
17
17
  To manage models, the `xspect models` command can be used. This command allows you to download, train, and view available models.
18
18
 
@@ -43,6 +43,8 @@ To train a model with NCBI data, run the following command:
43
43
  xspect models train ncbi
44
44
  ```
45
45
 
46
+ By default, XspecT filters out NCBI accessions that do not meed minimum N50 thresholds, have an inconclusive taxonomy check status, or are deemed atypical by NCBI. Furthermore, species with "Candidatus" and "sp." in their species names are filtered out. To disable filtering behavior, use the respective flag (see `xspect models train ncbi --help`).
47
+
46
48
  If you would like to train models with manually curated data from a directory, you can use:
47
49
 
48
50
  ```bash
@@ -114,16 +116,24 @@ xspect classify species --sparse-sampling-step 10 Acinetobacter path
114
116
 
115
117
  This will only consider every 10th kmer in the sample.
116
118
 
119
+ ### Inclusion of display names
120
+ By default, the classification results show only the taxonomy ID of each species along with its corresponding score for better readability. To display the full names associated with each taxonomy ID, you can use the `--display-names` (or `-n`) option:
121
+
122
+ ```bash
123
+ xspect classify species --display-names Acinetobacter path
124
+ ```
125
+ The output will then be formatted as: `Taxonomy_ID - Display_Name: Score` for each species.
126
+
117
127
  ### MLST Classification
118
128
 
119
129
  Samples can also be classified based on Multi-locus sequence type schemas. To MLST-classify a sample, run:
120
130
 
121
131
  ```bash
122
- xspect classify-mlst -p path
132
+ xspect classify mlst
123
133
  ```
124
134
 
125
135
  ## Filtering
126
- XspecT can also be used to filter samples based on their classification results. This is useful when analyzing metagenome samples, for example when looking at genomic bycatch.
136
+ XspecT can also be used to filter samples based on their classification results. This is useful when analyzing metagenomic samples, for example when looking at genomic bycatch.
127
137
 
128
138
  To filter samples, the command `xspect filter` can be used. This command will filter the samples based on the specified criteria.
129
139
 
@@ -20,11 +20,14 @@ Get started by cloning the repository:
20
20
  git clone https://github.com/BIONF/XspecT2.git
21
21
  ```
22
22
 
23
- You then need to build the web application using Vite. Navigate to the `xspect-web` directory and run the build command, which will also watch for changes:
23
+ You then need to build the web application using Vite. Navigate to the `xspect-web` directory, install dependencies, and run the build command, which will also watch for changes:
24
24
  ```bash
25
25
  cd XspecT2/src/xspect/xspect-web
26
26
  ```
27
27
  ```bash
28
+ npm i
29
+ ```
30
+ ```bash
28
31
  npx vite build --watch
29
32
  ```
30
33
 
@@ -15,5 +15,7 @@ nav:
15
15
  - Quickstart: quickstart.md
16
16
  - CLI: cli.md
17
17
  - "Web App": web.md
18
- - "Understanding XspecT": understanding.md
18
+ - "Understanding XspecT":
19
+ - understanding.md
20
+ - benchmark.md
19
21
  - Contributing: contributing.md
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "XspecT"
3
- version = "0.5.3"
3
+ version = "0.6.0"
4
4
  description = "Tool to monitor and characterize pathogens using Bloom filters."
5
5
  readme = {file = "README.md", content-type = "text/markdown"}
6
6
  license = {file = "LICENSE"}
@@ -18,7 +18,10 @@ dependencies = [
18
18
  "xxhash",
19
19
  "fastapi",
20
20
  "uvicorn",
21
- "python-multipart"
21
+ "python-multipart",
22
+ "mappy",
23
+ "pysam",
24
+ "numpy"
22
25
  ]
23
26
  classifiers = [
24
27
  "Intended Audience :: Developers",
@@ -0,0 +1,22 @@
1
+ process classifySample {
2
+ conda "./scripts/benchmark/environment.yml"
3
+ cpus 4
4
+ memory '32 GB'
5
+
6
+ input:
7
+ path sample
8
+
9
+ output:
10
+ path "${sample.baseName}.json"
11
+
12
+ script:
13
+ """
14
+ xspect classify species -g Acinetobacter -i ${sample} -o ${sample.baseName}.json
15
+ """
16
+
17
+ stub:
18
+ """
19
+ mkdir -p results
20
+ touch results/${sample.baseName}.json
21
+ """
22
+ }
@@ -0,0 +1,7 @@
1
+ name: xspect-benchmark
2
+ channels:
3
+ - conda-forge
4
+ dependencies:
5
+ - pip
6
+ - pip:
7
+ - XspecT