cryoem-halfmap-qc 0.3.2__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.
Files changed (55) hide show
  1. cryoem_halfmap_qc-0.3.2.dist-info/METADATA +268 -0
  2. cryoem_halfmap_qc-0.3.2.dist-info/RECORD +55 -0
  3. cryoem_halfmap_qc-0.3.2.dist-info/WHEEL +5 -0
  4. cryoem_halfmap_qc-0.3.2.dist-info/entry_points.txt +2 -0
  5. cryoem_halfmap_qc-0.3.2.dist-info/licenses/LICENSE +21 -0
  6. cryoem_halfmap_qc-0.3.2.dist-info/top_level.txt +2 -0
  7. cryoem_mrc/__init__.py +135 -0
  8. cryoem_mrc/__main__.py +218 -0
  9. cryoem_mrc/analysis.py +815 -0
  10. cryoem_mrc/analysis_driver.py +369 -0
  11. cryoem_mrc/cli.py +159 -0
  12. cryoem_mrc/cohort_composition.py +75 -0
  13. cryoem_mrc/cohort_emdb.py +130 -0
  14. cryoem_mrc/cohort_labels.py +81 -0
  15. cryoem_mrc/cohort_pipeline.py +334 -0
  16. cryoem_mrc/cohort_resolution.py +156 -0
  17. cryoem_mrc/conformation_coupling.py +284 -0
  18. cryoem_mrc/conformation_pair.py +780 -0
  19. cryoem_mrc/density_source.py +49 -0
  20. cryoem_mrc/feature_ml.py +88 -0
  21. cryoem_mrc/figure_cleanup.py +87 -0
  22. cryoem_mrc/guinier_benchmark.py +338 -0
  23. cryoem_mrc/guinier_sharpening.py +521 -0
  24. cryoem_mrc/half_map_repro.py +180 -0
  25. cryoem_mrc/hessian.py +116 -0
  26. cryoem_mrc/incremental_prediction.py +370 -0
  27. cryoem_mrc/io.py +166 -0
  28. cryoem_mrc/local_fsc.py +458 -0
  29. cryoem_mrc/local_resolution.py +284 -0
  30. cryoem_mrc/local_resolution_io.py +359 -0
  31. cryoem_mrc/local_stats.py +235 -0
  32. cryoem_mrc/map_grid.py +374 -0
  33. cryoem_mrc/mask_bbox.py +116 -0
  34. cryoem_mrc/mechanics.py +398 -0
  35. cryoem_mrc/metric_comparison.py +236 -0
  36. cryoem_mrc/model_building_export.py +227 -0
  37. cryoem_mrc/model_map.py +97 -0
  38. cryoem_mrc/multiscale.py +124 -0
  39. cryoem_mrc/pipeline.py +196 -0
  40. cryoem_mrc/placement_decoupling.py +349 -0
  41. cryoem_mrc/placement_supplement.py +193 -0
  42. cryoem_mrc/placement_utility.py +1844 -0
  43. cryoem_mrc/qscore_validation.py +427 -0
  44. cryoem_mrc/reliability.py +205 -0
  45. cryoem_mrc/reliability_driver.py +638 -0
  46. cryoem_mrc/repo_paths.py +245 -0
  47. cryoem_mrc/rigidity.py +206 -0
  48. cryoem_mrc/structure_validation.py +1185 -0
  49. cryoem_mrc/tui.py +240 -0
  50. cryoem_mrc/tv_curvature.py +332 -0
  51. cryoem_mrc/visualize.py +203 -0
  52. cryoem_mrc/volume_slices.py +139 -0
  53. style/__init__.py +25 -0
  54. style/nature.py +194 -0
  55. style/thesis_palette.py +151 -0
@@ -0,0 +1,268 @@
1
+ Metadata-Version: 2.4
2
+ Name: cryoem-halfmap-qc
3
+ Version: 0.3.2
4
+ Summary: Local map reliability from cryo-EM density and half-maps
5
+ Author: Sarthak Mohanty
6
+ License: MIT
7
+ Project-URL: Repository, https://github.com/sarthaktexas/cryoem-halfmap-qc
8
+ Project-URL: Zenodo, https://doi.org/10.5281/zenodo.20618526
9
+ Keywords: cryo-em,half-map,reliability,mrc,structural-biology
10
+ Classifier: Development Status :: 4 - Beta
11
+ Classifier: Intended Audience :: Science/Research
12
+ Classifier: License :: OSI Approved :: MIT License
13
+ Classifier: Programming Language :: Python :: 3
14
+ Classifier: Topic :: Scientific/Engineering :: Bio-Informatics
15
+ Requires-Python: >=3.10
16
+ Description-Content-Type: text/markdown
17
+ License-File: LICENSE
18
+ Requires-Dist: numpy>=1.24
19
+ Requires-Dist: scipy>=1.10
20
+ Requires-Dist: mrcfile>=1.4
21
+ Requires-Dist: matplotlib>=3.7
22
+ Requires-Dist: gemmi>=0.6
23
+ Requires-Dist: seaborn>=0.13
24
+ Requires-Dist: pandas>=2.0
25
+ Requires-Dist: biopython>=1.80
26
+ Requires-Dist: tqdm>=4.60
27
+ Provides-Extra: dev
28
+ Requires-Dist: build; extra == "dev"
29
+ Requires-Dist: twine; extra == "dev"
30
+ Dynamic: license-file
31
+
32
+ # cryoem-halfmap-qc
33
+
34
+ [![DOI](https://zenodo.org/badge/1262218538.svg)](https://doi.org/10.5281/zenodo.20618526)
35
+
36
+ Python tools for **local map reliability** in cryo-EM reconstructions: density statistics, half-map reproducibility, windowed local FSC (Å), a reproducibility score (H_repro), and build/caution/omit zones.
37
+
38
+ The goal is to test whether inexpensive map features track **half-map cross-correlation** and **local FSC** well enough to guide modeling. This is **not** a claim that density alone defines molecular flexibility.
39
+
40
+ All volumes use NumPy 3D arrays in `(Z, Y, X)` order (section, row, column), consistent with typical `mrcfile` layouts.
41
+
42
+ ---
43
+
44
+ ## Install
45
+
46
+ **PyPI:** not published yet (`pip install cryoem-halfmap-qc` will fail until the first release is uploaded). See [Publishing to PyPI](#publishing-to-pypi) below.
47
+
48
+ Until then, install from GitHub or a local checkout:
49
+
50
+ ```bash
51
+ git clone https://github.com/sarthaktexas/cryoem-halfmap-qc.git
52
+ cd cryoem-halfmap-qc
53
+ pip install -e .
54
+
55
+ # or without cloning:
56
+ pip install "git+https://github.com/sarthaktexas/cryoem-halfmap-qc.git@v0.3.2"
57
+ ```
58
+
59
+ This installs the **`halfmap-qc`** command on your PATH (PyPI package name will be `cryoem-halfmap-qc` once published).
60
+
61
+ **Help & interactive mode:**
62
+
63
+ ```bash
64
+ halfmap-qc # interactive menu (when run in a terminal)
65
+ halfmap-qc help # full command reference
66
+ halfmap-qc --help # argparse summary + examples
67
+ halfmap-qc cohort --help # flags for one subcommand
68
+ halfmap-qc interactive # menu explicitly
69
+ ```
70
+
71
+ **Dependencies:** NumPy, SciPy, mrcfile, Matplotlib, gemmi, pandas.
72
+
73
+ ---
74
+
75
+ ## Data layout
76
+
77
+ Cryo-EM maps are **not** stored in this repository (too large for git). After cloning, create local directories:
78
+
79
+ ```text
80
+ data/emd_<ID>-<label>/ # deposited map + half-maps (.map or .mrc)
81
+ outputs/emd_<ID>/ # pipeline products (created by scripts)
82
+ cohort/manifest.csv # EMDB IDs, relative paths, contours, validation labels
83
+ ```
84
+
85
+ Download deposited and half maps from [EMDB](https://www.ebi.ac.uk/emdb/). Use the depositor-recommended contour for each entry (listed in `cohort/manifest.csv`). See [docs/COHORT.md](docs/COHORT.md) for download status and pipeline progress.
86
+
87
+ ---
88
+
89
+ ## Quick start
90
+
91
+ Run from the project root (where `data/` and `cohort/manifest.csv` live).
92
+
93
+ **Single-map features:**
94
+
95
+ ```bash
96
+ halfmap-qc features path/to/map.mrc --out map_features.npz --float32
97
+ # shorthand (legacy): halfmap-qc path/to/map.mrc --out map_features.npz --float32
98
+ ```
99
+
100
+ **Typical workflow** (features on avg-of-halves; reliability MRCs on deposited primary grid):
101
+
102
+ ```bash
103
+ EMD=49450
104
+ CONTOUR=0.116
105
+ DATA=data/emd_${EMD}-mgtA_e2p+e1
106
+
107
+ halfmap-qc analyze \
108
+ --features "${DATA}/emd_${EMD}_avg_features_t0116.npz" \
109
+ --half1 "${DATA}/emd_${EMD}_half_map_1.map" \
110
+ --half2 "${DATA}/emd_${EMD}_half_map_2.map" \
111
+ --reference "${DATA}/emd_${EMD}.map" \
112
+ --contour "${CONTOUR}" \
113
+ --out-dir "outputs/emd_${EMD}/analysis"
114
+
115
+ halfmap-qc reliability --emd-id "${EMD}" --contour "${CONTOUR}" \
116
+ --features "${DATA}/emd_${EMD}_avg_features_t0116.npz" \
117
+ --halfmap-npz "outputs/emd_${EMD}/analysis/halfmap_metrics.npz"
118
+ ```
119
+
120
+ **Cohort batch** (all active manifest entries with local data):
121
+
122
+ ```bash
123
+ halfmap-qc cohort --pending
124
+ ```
125
+
126
+ **ARC / SLURM** (one map per array task; save a local `*.sbatch` — not in git):
127
+
128
+ ```bash
129
+ # After pip install -e . and rsync data/ + cohort/manifest.csv to $SCRATCH/thesis
130
+ N=$(($(halfmap-qc cohort-ids | wc -l) - 1))
131
+ sbatch --account=wrz135 --array=0-${N} --cpus-per-task=4 --mem=32G --time=00:45:00 \
132
+ --wrap='halfmap-qc cohort --emd-id $(halfmap-qc cohort-ids | sed -n "$((SLURM_ARRAY_TASK_ID+1))p")'
133
+ ```
134
+
135
+ Or save a multi-line script as e.g. `~/halfmap-qc_array.sbatch` (gitignored) and `sbatch --array=0-${N} ~/halfmap-qc_array.sbatch`.
136
+
137
+ ---
138
+
139
+ ## CLI (`halfmap-qc`)
140
+
141
+ | Command | Purpose |
142
+ | --- | --- |
143
+ | *(no args, TTY)* | Interactive menu |
144
+ | `halfmap-qc help` | Full reference + install notes |
145
+ | `halfmap-qc features` | Local density / multiscale features → `.npz` |
146
+ | `halfmap-qc analyze` | Windowed half-map CC + feature correlations |
147
+ | `halfmap-qc reliability` | Reliability score, build zones, MRC export |
148
+ | `halfmap-qc cohort` | Batch pipeline from `cohort/manifest.csv` |
149
+ | `halfmap-qc cohort-ids` | Print EMDB IDs (for SLURM array jobs) |
150
+ | `halfmap-qc interactive` | Interactive menu (same as bare `halfmap-qc`) |
151
+
152
+ Legacy: `python -m cryoem_mrc` still works (same as `halfmap-qc features`).
153
+
154
+ ## Publishing to PyPI
155
+
156
+ One-time setup:
157
+
158
+ 1. Create an account at [pypi.org](https://pypi.org/account/register/) (and optionally [test.pypi.org](https://test.pypi.org/) for a dry run).
159
+ 2. On PyPI → **Your projects** → **Add new project** → name it `cryoem-halfmap-qc` (or claim it when uploading).
160
+ 3. On PyPI → **Account settings** → **Publishing** → **Add a new pending publisher**:
161
+ - PyPI project: `cryoem-halfmap-qc`
162
+ - Owner: `sarthaktexas` (your GitHub user/org)
163
+ - Repository: `cryoem-halfmap-qc`
164
+ - Workflow: `publish.yml`
165
+ - Environment: (leave blank unless you use one)
166
+
167
+ Release:
168
+
169
+ ```bash
170
+ # bump version in pyproject.toml first, then:
171
+ git add pyproject.toml cryoem_mrc/__init__.py
172
+ git commit -m "Release v0.3.2"
173
+ git tag v0.3.2
174
+ git push origin main --tags
175
+ ```
176
+
177
+ On GitHub → **Releases** → **Draft a new release** → choose tag `v0.3.2` → **Publish release**. The [`.github/workflows/publish.yml`](.github/workflows/publish.yml) workflow builds the wheel and uploads to PyPI.
178
+
179
+ Test install after publish:
180
+
181
+ ```bash
182
+ pip install cryoem-halfmap-qc
183
+ halfmap-qc --version
184
+ ```
185
+
186
+ Manual upload (without GitHub Actions):
187
+
188
+ ```bash
189
+ pip install build twine
190
+ python -m build
191
+ twine upload dist/*
192
+ ```
193
+
194
+ ## Scripts (thesis / optional)
195
+
196
+ Thesis figure runners (`scripts/rerun_all_figures.py`, `scripts/run_cohort_summary_figures.py`, Figma export scripts, etc.) and `cryoem_mrc/thesis_figures.py` are **local-only** (gitignored) like `figma-plugins/`. Clone the repo on a machine that already has those files, or keep a local copy from before they were untracked.
197
+
198
+ ---
199
+
200
+ ## Python API (high level)
201
+
202
+ ```python
203
+ import numpy as np
204
+ from cryoem_mrc import load_full_and_half_maps, run_pipeline, half_map_local_metrics
205
+ from cryoem_mrc.reliability import compute_reliability_maps, classify_build_zones
206
+
207
+ bundle = load_full_and_half_maps(
208
+ "full.mrc", "half1.mrc", "half2.mrc", dtype=np.float32, resample_if_needed=True
209
+ )
210
+ metrics = half_map_local_metrics(bundle.half1, bundle.half2, window=5)
211
+ # metrics["windowed_halfmap_correlation"], etc.
212
+
213
+ features = run_pipeline("map.mrc", use_float32=True)
214
+ reliability = compute_reliability_maps(
215
+ bundle.half1, bundle.half2,
216
+ density_normalized=features["density_normalized"],
217
+ window=5,
218
+ )
219
+ zones = classify_build_zones(reliability["reliability_score"])
220
+ ```
221
+
222
+ **Package modules:** `io`, `map_grid`, `local_stats`, `multiscale`, `half_map_repro`, `local_fsc`, `mechanics`, `reliability`, `analysis`, `structure_validation`. Path helpers: `cryoem_mrc/repo_paths.py`.
223
+
224
+ ---
225
+
226
+ ## Methods summary
227
+
228
+ - **Windowed half-map correlation** is the fast internal reproducibility target for feature validation; **local FSC resolution (Å)** is the field-standard reference.
229
+ - **Local FSC** is computed in-repo (`cryoem_mrc.local_fsc`); external BlocRes / ResMap / MonoRes maps are not loaded.
230
+ - **H_repro** is the windowed gradient-constraint map *V* (legacy export name; ranked as **reliability_score**); **reliability_score** is an in-mask percentile used for build/caution/omit terciles. Resolvability gating uses windowed half-map CC or local FSC, not a separate disagreement map.
231
+ - **Local variance** is often the strongest single feature predictor of windowed half-map correlation.
232
+
233
+ **Thesis prose:** full narrative draft in [docs/THESIS_NARRATIVE.md](docs/THESIS_NARRATIVE.md). Writing guide and defense notes in [docs/THESIS_AND_PUBLICATION.md](docs/THESIS_AND_PUBLICATION.md).
234
+
235
+ ---
236
+
237
+ ## Tests
238
+
239
+ ```bash
240
+ python -m unittest discover -s tests -v
241
+ ```
242
+
243
+ ---
244
+
245
+ ## Citation
246
+
247
+ **Before the manuscript is published**, cite the software with the Zenodo concept DOI (resolves to the latest release; pin `v0.3.2` or a commit hash for exact reproducibility):
248
+
249
+ ```bibtex
250
+ @software{mohanty2026cryoem_halfmap_qc,
251
+ author = {Mohanty, Sarthak},
252
+ title = {cryoem-halfmap-qc: local map reliability from cryo-EM density and half-maps},
253
+ year = {2026},
254
+ doi = {10.5281/zenodo.20618526},
255
+ url = {https://doi.org/10.5281/zenodo.20618526},
256
+ version = {0.3.2}
257
+ }
258
+ ```
259
+
260
+ GitHub also reads [CITATION.cff](CITATION.cff) for the **Cite this repository** button.
261
+
262
+ **After publication**, cite the paper as the primary reference. Also cite this Zenodo archive when you need the exact pipeline version used in the work.
263
+
264
+ When the manuscript exists, add a `preferred-citation` block to `CITATION.cff` (template included there) and drop the BibTeX for the article into this section.
265
+
266
+ ## License
267
+
268
+ MIT License. See [LICENSE](LICENSE).
@@ -0,0 +1,55 @@
1
+ cryoem_halfmap_qc-0.3.2.dist-info/licenses/LICENSE,sha256=UXAZZ4qb_f-prHvxOzvvreBQVk-4SpKdzbxqM1TX04c,1072
2
+ cryoem_mrc/__init__.py,sha256=hO9W9Sk8lE7kBCbDPUE4hYUDJsJoyuL7rUwRd1PLsOA,3888
3
+ cryoem_mrc/__main__.py,sha256=6R_xbimGndhGpNTHHjn1sa4b5CEXKMhzNXUdW7rqP_4,7621
4
+ cryoem_mrc/analysis.py,sha256=wIGAgWhVm13yA7F0JH-iUUobIdTm0zeszAwCxtUsvc4,27318
5
+ cryoem_mrc/analysis_driver.py,sha256=BrQkGEqvoVDl0VLFjYzi6xuwnwxVRF1SH1jlofpoHGM,15129
6
+ cryoem_mrc/cli.py,sha256=m9rdWCYoUvJe4AwzgIjwWaNSTwyrjuIcj35-KwzOTlE,4762
7
+ cryoem_mrc/cohort_composition.py,sha256=OTgveBKSEgLQt_y_aSFJH45XicSLEt3f7kGkKQCmP0k,2440
8
+ cryoem_mrc/cohort_emdb.py,sha256=1PB43Z-lic2MV_-JnXbXSqH6K9PE4XYjPrLK-mkAzR4,4126
9
+ cryoem_mrc/cohort_labels.py,sha256=xQ2SJPmSN24I3g7veU9vFshPDLd9qPx5LvZmjO7NrQ0,2516
10
+ cryoem_mrc/cohort_pipeline.py,sha256=tfhY7krKYvMDmHmxZpXdtuvufJsOv5MW6UlKVaHoB_o,10950
11
+ cryoem_mrc/cohort_resolution.py,sha256=fWxGJjQ7q8iqBgYn9KSXQKvE5chedibPctNsrrAC0JQ,4969
12
+ cryoem_mrc/conformation_coupling.py,sha256=8Fk8rsyahaTz3m3K1Vr4GD66p_vtQ34Tp81_cuY72L4,9114
13
+ cryoem_mrc/conformation_pair.py,sha256=wb6kxbUacobdIVoChw2wCjejOb-fN6fUa2HOnE5q3C4,28137
14
+ cryoem_mrc/density_source.py,sha256=FYlM76f_hLzU8w5m3xbXYUAK6yie9eFiYLK1r9CCScE,1644
15
+ cryoem_mrc/feature_ml.py,sha256=xCWRGD-0DQdH7O-6mPLhe6vKoO7xwYWRRC2-h0JysCc,2669
16
+ cryoem_mrc/figure_cleanup.py,sha256=BTzDcI-4yvq6CvBb-wqVTWvMjD5S2xRcZmk4HVt81s0,2936
17
+ cryoem_mrc/guinier_benchmark.py,sha256=_PuedyaXDn3pGSKyv3L8IhWHanYPdZOTsSELoFiR4sA,11790
18
+ cryoem_mrc/guinier_sharpening.py,sha256=pb85ELioeuttaMMGJIINvEc2Qd14ZL92uAfRdWZUpuY,16922
19
+ cryoem_mrc/half_map_repro.py,sha256=ByqkeT2vkROzbgfQwsi1bb5GGfixcQxWEnt1qCFX8bk,6371
20
+ cryoem_mrc/hessian.py,sha256=hnb9PnklgA8owxPzxrcvHpEqMqvkIykx72fAlRTugqY,3485
21
+ cryoem_mrc/incremental_prediction.py,sha256=5nOFxuGp8LGbOOnQ3p3u3Y9Pz6pZC2JkJqHIc2WZjuE,12372
22
+ cryoem_mrc/io.py,sha256=d4b8-ghe4bBI-hgBDsDfgCogEdkogk0KonVm5ZD2IBo,5384
23
+ cryoem_mrc/local_fsc.py,sha256=uQXie1wpBlI-DfTBtmOya6RK5oH_YwTaNitfOUcJ8IM,15810
24
+ cryoem_mrc/local_resolution.py,sha256=eTx5GhFBZTvezl-T0_Mso2x7N3QwBGAaBUgTK5k6exI,9845
25
+ cryoem_mrc/local_resolution_io.py,sha256=2igmlfIce4qrbX_GwxFJSyFNfaE_QsDVEJshUeuZwr4,12214
26
+ cryoem_mrc/local_stats.py,sha256=rY1iE-CkToFHSUo-7sDSp_CCKC1VYS-9Kob1p4p6gho,8159
27
+ cryoem_mrc/map_grid.py,sha256=V--gaXklZPH-YIyZjcQ8EJ_lBFtYC50inmbHYQwJo7w,12306
28
+ cryoem_mrc/mask_bbox.py,sha256=B5EX-KS2NdOe8sv8oa7uhgegoG1NIiPXxTOA-lZIWaI,3423
29
+ cryoem_mrc/mechanics.py,sha256=Rk4swGcYDRewF41LVZ1jB7ZfuP9lwEa3Tl-RQjQBG38,12778
30
+ cryoem_mrc/metric_comparison.py,sha256=2E-8wSuQ85mTztpc1v8Fq9eWbDC8QL2VLuqoUih1L-g,8340
31
+ cryoem_mrc/model_building_export.py,sha256=cCEpHyf5_diZc3eOX1eB8NuNflQ_vi0X3sVZ12qn7wU,7770
32
+ cryoem_mrc/model_map.py,sha256=OrS8r3nwdE0Xw-7gDygvJVA-FpS2OnlRI03EqaT9oqM,3650
33
+ cryoem_mrc/multiscale.py,sha256=MH4fadd85JMzg6QnZ8_52YLjBUHlnwEcPbpB1zORqmA,4377
34
+ cryoem_mrc/pipeline.py,sha256=2txsl-v3OkUc4CDzrfwSxf2f0_oedVuAO3ucKIJ37cg,7145
35
+ cryoem_mrc/placement_decoupling.py,sha256=VMR2LBmJWYwJn-VFcL91T9tmachNNHUzK0GtCo3IH-o,12092
36
+ cryoem_mrc/placement_supplement.py,sha256=v7Cm0zKZySmNSkh0fdSpmrsSGwqUjZl2qVRUuR5zUQ4,6351
37
+ cryoem_mrc/placement_utility.py,sha256=7xrSJe2EJeA4PiMgZ9daSRvuN--Y-p9NZLqTivAN4jA,66412
38
+ cryoem_mrc/qscore_validation.py,sha256=0_Rfvp8scyLE7OSHmyk0D7sahsgLF-LH5lk4GxTpKoE,14319
39
+ cryoem_mrc/reliability.py,sha256=sOovh3oTya6nm8zBYquU08Mfr3CDFBNNN5C6LrT4Pgg,6724
40
+ cryoem_mrc/reliability_driver.py,sha256=OOhZ65v18011xehXx_2IADg3MP5iv6k18SWAXDaQVXM,23651
41
+ cryoem_mrc/repo_paths.py,sha256=DqP7wCTz_SzIVb3C0p0R4DDZnByZODWkyWVsJpZST3A,8980
42
+ cryoem_mrc/rigidity.py,sha256=BEAr8GsM-1Q0haPE6vwCcIgBlbS8J0k7lQjYcpHIvRE,7758
43
+ cryoem_mrc/structure_validation.py,sha256=yzp5ruhapHm5CCsuYpz2WBtUxS0mxRusHK24MamNYNQ,42234
44
+ cryoem_mrc/tui.py,sha256=FIe94fZyCf4Qj-satHh7X8DOI_X1FTNHrr6rXMOpLXI,7034
45
+ cryoem_mrc/tv_curvature.py,sha256=wBL3jNY66Kpc9_M4AJ4tSwRoV3yxfeg687iC8KsBX8I,11966
46
+ cryoem_mrc/visualize.py,sha256=2C84qkPUGnmwC5RM0raCYyYTdz4OrH0strSjPAM3Hpc,6779
47
+ cryoem_mrc/volume_slices.py,sha256=RxRH1j3t-gCR5t_LB_kBPMlswlKl2K0bmmEveUeE0aM,3918
48
+ style/__init__.py,sha256=j4KKTYWhv6pmd-AKAjn5B-ZQ9um-3rwPLn2B4bOkduU,511
49
+ style/nature.py,sha256=ekthsCMUnp-FHNi-qHaAtw8HSai8WOeiWjsS_EbhmsA,5220
50
+ style/thesis_palette.py,sha256=Kxb4RtuMZk_o5oPocdTQC3Gl0Q1GrRMHos6Y9IaUphE,3926
51
+ cryoem_halfmap_qc-0.3.2.dist-info/METADATA,sha256=OE_HhQ8wx2fF9kujlZtTEHwuf76Dt3fvsWd8V8aMcds,9997
52
+ cryoem_halfmap_qc-0.3.2.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
53
+ cryoem_halfmap_qc-0.3.2.dist-info/entry_points.txt,sha256=qGGvXnOvP-n5w53Xkt7nvlJkakXnDCKgOtNcvPXJWvQ,51
54
+ cryoem_halfmap_qc-0.3.2.dist-info/top_level.txt,sha256=1XtUN4SgNNGh7Yx5Ea94unaHqjYsG3BxCRcXypWX5gk,17
55
+ cryoem_halfmap_qc-0.3.2.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (82.0.1)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ halfmap-qc = cryoem_mrc.cli:main
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Sarthak Mohanty
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,2 @@
1
+ cryoem_mrc
2
+ style
cryoem_mrc/__init__.py ADDED
@@ -0,0 +1,135 @@
1
+ """Cryo-EM MRC density map feature extraction pipeline."""
2
+
3
+ try:
4
+ from importlib.metadata import version as _pkg_version
5
+
6
+ __version__ = _pkg_version("cryoem-halfmap-qc")
7
+ except Exception:
8
+ __version__ = "0.3.2"
9
+
10
+ from .analysis import (
11
+ BinnedRelationship,
12
+ FeatureCorrelation,
13
+ MaskedAnalysisResult,
14
+ binned_feature_by_target,
15
+ build_contour_mask,
16
+ compute_feature_target_correlations,
17
+ half_map_local_metrics_chunked,
18
+ plot_feature_vs_target_scatter,
19
+ plot_halfmap_metric_histogram,
20
+ write_correlation_csv,
21
+ write_summary_text,
22
+ )
23
+ from .half_map_repro import (
24
+ half_map_local_metrics,
25
+ plot_half_map_metric_distributions,
26
+ save_half_map_metrics_mrc,
27
+ )
28
+ from .io import load_mrc, save_rigidity_mrc, save_volume_like_reference
29
+ from .local_fsc import compute_local_fsc_resolution, save_local_fsc_resolution_mrc
30
+ from .local_stats import sliding_local_statistics_pipeline
31
+ from .local_resolution_io import (
32
+ LocalResolutionGridReport,
33
+ LocalResolutionSource,
34
+ build_dataset_from_pipeline,
35
+ export_masked_feature_dataset,
36
+ load_local_resolution_map,
37
+ resample_local_resolution_onto_reference,
38
+ verify_local_resolution_matches_reference,
39
+ )
40
+ from .map_grid import (
41
+ FullHalfMapBundle,
42
+ GridAlignmentReport,
43
+ MapGrid,
44
+ ensure_same_grid,
45
+ load_full_and_half_maps,
46
+ load_map_grid,
47
+ resample_volume_onto_grid,
48
+ verify_grid_alignment,
49
+ verify_same_grid_as_reference,
50
+ )
51
+ from .multiscale import group_multiscale_features
52
+ from .pipeline import (
53
+ load_feature_maps,
54
+ run_pipeline,
55
+ save_feature_maps,
56
+ save_feature_maps_npy,
57
+ )
58
+ from .mechanics import (
59
+ compute_mechanics_headlines,
60
+ compute_mechanics_maps,
61
+ fluctuation_constraint_decomposition,
62
+ )
63
+ from .reliability import (
64
+ attach_reliability_to_features,
65
+ classify_build_zones,
66
+ compute_reliability_maps,
67
+ save_build_zone_mrc,
68
+ save_reliability_mrc,
69
+ )
70
+ from .rigidity import compute_rigidity_map
71
+ from .visualize import (
72
+ plot_central_orthogonal_slices,
73
+ plot_feature_slices,
74
+ plot_rigidity_inspection,
75
+ plot_volume_histogram,
76
+ rigidity_inspection_keys,
77
+ )
78
+
79
+ __all__ = [
80
+ "load_mrc",
81
+ "save_volume_like_reference",
82
+ "save_rigidity_mrc",
83
+ "run_pipeline",
84
+ "save_feature_maps",
85
+ "save_feature_maps_npy",
86
+ "load_feature_maps",
87
+ "group_multiscale_features",
88
+ "compute_mechanics_headlines",
89
+ "compute_mechanics_maps",
90
+ "fluctuation_constraint_decomposition",
91
+ "attach_reliability_to_features",
92
+ "classify_build_zones",
93
+ "compute_reliability_maps",
94
+ "save_build_zone_mrc",
95
+ "save_reliability_mrc",
96
+ "compute_rigidity_map",
97
+ "plot_feature_slices",
98
+ "plot_rigidity_inspection",
99
+ "rigidity_inspection_keys",
100
+ "compute_local_fsc_resolution",
101
+ "save_local_fsc_resolution_mrc",
102
+ "LocalResolutionSource",
103
+ "LocalResolutionGridReport",
104
+ "load_local_resolution_map",
105
+ "resample_local_resolution_onto_reference",
106
+ "verify_local_resolution_matches_reference",
107
+ "export_masked_feature_dataset",
108
+ "build_dataset_from_pipeline",
109
+ "MapGrid",
110
+ "GridAlignmentReport",
111
+ "FullHalfMapBundle",
112
+ "load_map_grid",
113
+ "verify_grid_alignment",
114
+ "verify_same_grid_as_reference",
115
+ "resample_volume_onto_grid",
116
+ "ensure_same_grid",
117
+ "load_full_and_half_maps",
118
+ "sliding_local_statistics_pipeline",
119
+ "half_map_local_metrics",
120
+ "save_half_map_metrics_mrc",
121
+ "plot_half_map_metric_distributions",
122
+ "plot_central_orthogonal_slices",
123
+ "plot_volume_histogram",
124
+ "BinnedRelationship",
125
+ "FeatureCorrelation",
126
+ "MaskedAnalysisResult",
127
+ "binned_feature_by_target",
128
+ "build_contour_mask",
129
+ "compute_feature_target_correlations",
130
+ "half_map_local_metrics_chunked",
131
+ "plot_feature_vs_target_scatter",
132
+ "plot_halfmap_metric_histogram",
133
+ "write_correlation_csv",
134
+ "write_summary_text",
135
+ ]