Symmetry projectors and modulation signal loss estimators for screening molecular crystals for directional dark matter detection.
Project description
symmscreen
Symmetry projectors and modulation signal loss estimators for screening molecular crystals for directional dark matter detection.
Companion package to "The Role of Symmetries in Dark Matter Detector Design" (arXiv:..., Benjamin Lillard, Jack D. Shergold, and Juri Smirnov). The paper develops a symmetry-projection framework that predicts how much of a molecule's directional dark matter scattering signal survives crystallisation, using only the crystal's space group and the molecule's point-group symmetry and geometry. This package implements exactly that framework (paper Secs. 3-6): the crystal and molecule point-group projectors, the combined survival operator, and the three Lambda estimators for the fractional modulation-signal loss.
This package is intentionally lightweight, and does not compute electronic structure, form factors, scattering rates, or true modulation amplitudes. See SCarFFF and vsdm for software implementing these calculations.
Installation
pip install symmscreen
Quickstart
The fastest way to get the modulation loss estimate, $\Lambda_\mathrm{coord}$, for a molecular crystal with known coordinates is:
import symmscreen as ss
ss.lambda_coord("your_crystal.cif")
There's a matching one-line function for the quadrupole class of the crystal, and of the molecule itself, too: ss.crystal_quadrupole_class(cif_path), ss.molecule_quadrupole_class(cif_path).
If you want more than one metric for the same crystal, or want to inspect the underlying projector matrices, build a CombinedSurvival object directly instead. This caches the crystal/molecule projectors internally, so nothing is recomputed between calls. Since a CIF gives you the molecule's actual orientation, $\mathcal{T}$, the natural estimators here are the orientation-specific ones, lambda_L and lambda_coord:
from symmscreen import CombinedSurvival
survival = CombinedSurvival.from_cif("your_crystal.cif")
survival.crystal.quadrupole_class # k in {0, 1, 2, 3, 5}, the quadrupole class of the crystal, Q_k.
survival.molecule.quadrupole_class # k in {0, 1, 2, 3, 5}, the quadrupole class of the molecule's own symmetry H.
survival.crystal.matrix(l=2) # Pi_2^(L), the l=2 projector for the crystal symmetry.
survival.molecule.matrix(l=2) # Pi_2^(H), the l=2 projector for the internal molecule symmetry.
survival.matrix(l=2) # C^(2)(T), the combined survival operator.
survival.lambda_L() # Lambda^(L)(T), modulation signal loss due to crystallisation alone, for this crystal's specific orientation, T.
survival.lambda_coord() # Lambda_coord, coordinate-aware estimator of total modulation signal loss.
Or work purely from symmetry labels, with no CIF or coordinates at all. Here the relative orientation, $\mathcal{T}$, is generally unknown, so the natural estimators are the analytic $\mathcal{T}$-averaged quantities, lambda_L_avg and lambda_ideal_avg. These have matching one-line functions that take the same symmetry labels rather than a CIF:
import symmscreen as ss
ss.lambda_L_avg(mol_pg_symbol="D6h", crys_pg_symbol="D2h")
ss.lambda_ideal_avg(mol_pg_symbol="D6h", crys_pg_symbol="D2h") # ~ sqrt(2)/5, matching the benzene example in the paper.
Or build the combined survival operator and access them from there, as well as the matrices:
from symmscreen import CombinedSurvival
survival = CombinedSurvival.from_symmetry(mol_pg_symbol="D6h", crys_pg_symbol="D2h")
survival.matrix(l=2) # C^(2), combined survival operator at l=2. Defaults to T=I, with T the relative orientation.
survival.lambda_L_avg() # <Lambda^(L)>_T, loss due to crystallisation alone, averaged over T.
survival.lambda_ideal_avg() # <Lambda>_T, ~sqrt(2)/5, matching the benzene example in the paper.
from_symmetry also takes an optional relative rotation T (the paper's
$\mathcal{T}$), for when you want a specific embedding rather than the $\mathcal{T}$-averaged estimators above:
from symmscreen import CombinedSurvival
from scipy.spatial.transform import Rotation
T = Rotation.from_euler("z", 90, degrees=True).as_matrix() # e.g. a 90 degree rotation about z.
survival = CombinedSurvival.from_symmetry(mol_pg_symbol="D6h", crys_pg_symbol="D2h", T=T)
survival.matrix(l=2) # C^(2)(T), combined survival operator at l=2 for a fixed T.
survival.lambda_L() # Lambda^(L)(T), orientation-specific crystallistion loss, rather than T-averaged.
$\mathcal{T}$ defaults to the identity if omitted.
Getting a CIF
symmscreen does not contain any example structures, as crystal structure databases are generally not freely redistributable. However, experimentally determined molecular crystal structures are available from:
- Cambridge Structural Database (CCDC) — the largest database of organic and metal-organic crystal structures. Structures can be visualised, and CIFs can be downloaded via CCDC Access Structures. Full access requires an institutional licence.
- Crystallography Open Database (COD) — fully open-access, no licence required.
Citation
If you use this package, please use the following citation:
Bibtex goes here.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file symmscreen-0.1.1.tar.gz.
File metadata
- Download URL: symmscreen-0.1.1.tar.gz
- Upload date:
- Size: 19.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fcd85466e277db0e0a06e606212054051f5229384c2c6c098d204e81b847731c
|
|
| MD5 |
2473827bb36146b986ec5ac40bf50acd
|
|
| BLAKE2b-256 |
b71edf61ff552db00a4e63ac6d1a98b9ee545132d6cd540f1a5bbd720c8b4be9
|
Provenance
The following attestation bundles were made for symmscreen-0.1.1.tar.gz:
Publisher:
publish.yml on jdshergold/symmscreen
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
symmscreen-0.1.1.tar.gz -
Subject digest:
fcd85466e277db0e0a06e606212054051f5229384c2c6c098d204e81b847731c - Sigstore transparency entry: 2062692144
- Sigstore integration time:
-
Permalink:
jdshergold/symmscreen@3f77b9dc411189e6b3ab921dfb93cc3f2bbbab23 -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/jdshergold
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@3f77b9dc411189e6b3ab921dfb93cc3f2bbbab23 -
Trigger Event:
release
-
Statement type:
File details
Details for the file symmscreen-0.1.1-py3-none-any.whl.
File metadata
- Download URL: symmscreen-0.1.1-py3-none-any.whl
- Upload date:
- Size: 17.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
171577dc3b20a39736e9fe130b0d596f34ed5e0bb6976a3f9a5795acd3f6f337
|
|
| MD5 |
aaccfccfcf034d9e0fe47c651310a300
|
|
| BLAKE2b-256 |
6efce14e9ad4467c13234c8c2f1089d2e92752f6e5e4d1767fadabc4e6a4beff
|
Provenance
The following attestation bundles were made for symmscreen-0.1.1-py3-none-any.whl:
Publisher:
publish.yml on jdshergold/symmscreen
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
symmscreen-0.1.1-py3-none-any.whl -
Subject digest:
171577dc3b20a39736e9fe130b0d596f34ed5e0bb6976a3f9a5795acd3f6f337 - Sigstore transparency entry: 2062692565
- Sigstore integration time:
-
Permalink:
jdshergold/symmscreen@3f77b9dc411189e6b3ab921dfb93cc3f2bbbab23 -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/jdshergold
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@3f77b9dc411189e6b3ab921dfb93cc3f2bbbab23 -
Trigger Event:
release
-
Statement type: