Skip to content

Commit

Permalink
Merge pull request #60 from legend-exp/no-registry
Browse files Browse the repository at this point in the history
make_hpge: allow `None` as registry
  • Loading branch information
gipert authored Dec 5, 2024
2 parents 2f5a4c5 + 7536f8d commit 8fe4c52
Show file tree
Hide file tree
Showing 7 changed files with 62 additions and 65 deletions.
12 changes: 4 additions & 8 deletions src/legendhpges/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,13 @@
import numpy as np
from legendmeta import AttrsDict
from numpy.typing import ArrayLike, NDArray
from pint import Quantity
from pint import Quantity, get_application_registry
from pyg4ometry import geant4

from . import utils
from .materials import make_natural_germanium
from .registry import default_g4_registry
from .registry import default_units_registry as u

u = get_application_registry()


class HPGe(ABC, geant4.LogicalVolume):
Expand All @@ -39,13 +39,9 @@ def __init__(
self,
metadata: str | dict | AttrsDict,
name: str | None = None,
registry: geant4.Registry = default_g4_registry,
registry: geant4.Registry | None = None,
material: geant4.Material | None = None,
) -> None:
if registry is None:
msg = "registry cannot be None"
raise ValueError(msg)

if metadata is None:
msg = "metadata cannot be None"
raise ValueError(msg)
Expand Down
3 changes: 1 addition & 2 deletions src/legendhpges/make_hpge.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@
from .materials import make_enriched_germanium
from .p00664b import P00664B
from .ppc import PPC
from .registry import default_g4_registry
from .semicoax import SemiCoax
from .v02160a import V02160A
from .v02162b import V02162B
Expand All @@ -20,7 +19,7 @@

def make_hpge(
metadata: str | dict | AttrsDict,
registry: geant4.Registry = default_g4_registry,
registry: geant4.Registry | None,
allow_cylindrical_asymmetry: bool = True,
**kwargs,
) -> geant4.LogicalVolume:
Expand Down
20 changes: 11 additions & 9 deletions src/legendhpges/materials.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,10 @@
import math
from typing import Callable

from pint import Quantity
from pint import Quantity, get_application_registry
from pyg4ometry import geant4 as g4

from .registry import default_g4_registry
from .registry import default_units_registry as u
u = get_application_registry()

ge_iso_a: dict = {70: 69.924, 72: 71.922, 73: 72.923, 74: 73.921, 76: 75.921}
"""Molar weight of Germanium isotopes.
Expand All @@ -29,10 +28,12 @@
"""Measured density of natural germanium at room temperature."""


def _make_ge_isotopes(registry: g4.Registry) -> dict[int, Callable[[], g4.Isotope]]:
def _make_ge_isotopes(
registry: g4.Registry | None,
) -> dict[int, Callable[[], g4.Isotope]]:
def make_ge_iso(N: int):
name = f"Ge{N}"
if name in registry.materialDict:
if registry is not None and name in registry.materialDict:
return registry.materialDict[name]
return g4.Isotope(name, 32, N, ge_iso_a[N], registry)

Expand Down Expand Up @@ -66,9 +67,9 @@ def _make_germanium(
el_symbol: str,
iso_fracs: dict[int, float],
density: Quantity,
reg: g4.Registry,
reg: g4.Registry | None,
) -> g4.Material:
if ge_name not in reg.materialDict:
if reg is None or ge_name not in reg.materialDict:
el = g4.ElementIsotopeMixture(
f"Element{ge_name}", el_symbol, len(iso_fracs), reg
)
Expand All @@ -78,12 +79,13 @@ def _make_germanium(
el.add_isotope(isos[iso](), frac)
mat = g4.MaterialCompound(ge_name, density.to("g/cm^3").m, 1, reg)
mat.add_element_massfraction(el, 1)
return mat

return reg.materialDict[ge_name]


def make_natural_germanium(
registry: g4.Registry = default_g4_registry,
registry: g4.Registry | None = None,
) -> g4.Material:
"""Natural germanium material builder."""
return _make_germanium(
Expand All @@ -110,7 +112,7 @@ def enriched_germanium_density(ge76_fraction: float = 0.92) -> Quantity:

def make_enriched_germanium(
ge76_fraction: float = 0.92,
registry: g4.Registry = default_g4_registry,
registry: g4.Registry | None = None,
) -> g4.Material:
"""Enriched germanium material builder.
Expand Down
4 changes: 3 additions & 1 deletion src/legendhpges/p00664b.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,12 @@

import math

from pint import get_application_registry
from pyg4ometry import geant4

from .base import HPGe
from .registry import default_units_registry as u

u = get_application_registry()


class P00664B(HPGe):
Expand Down
15 changes: 0 additions & 15 deletions src/legendhpges/registry.py

This file was deleted.

4 changes: 3 additions & 1 deletion src/legendhpges/v02160a.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,13 @@

import math

from pint import get_application_registry
from pyg4ometry import geant4

from .base import HPGe
from .build_utils import make_pplus
from .registry import default_units_registry as u

u = get_application_registry()


class V02160A(HPGe):
Expand Down
69 changes: 40 additions & 29 deletions tests/test_det_profile.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,9 @@
InvertedCoax,
SemiCoax,
make_hpge,
materials,
)
from legendhpges.materials import make_natural_germanium

reg = geant4.Registry()
natural_germanium = make_natural_germanium(reg)
configs = TextDB(pathlib.Path(__file__).parent.resolve() / "configs")


Expand All @@ -32,109 +30,122 @@ def test_data_configs():
return ldata.get_path("legend/metadata/hardware/detectors/germanium/diodes")


def test_icpc(test_data_configs):
@pytest.fixture
def reg():
return geant4.Registry()


@pytest.fixture
def natural_germanium(reg):
return materials.make_natural_germanium(reg)


def test_icpc(test_data_configs, reg, natural_germanium):
InvertedCoax(
test_data_configs + "/V99000A.json", material=natural_germanium, registry=reg
)


def test_bege(test_data_configs):
def test_bege(test_data_configs, reg, natural_germanium):
BEGe(test_data_configs + "/B99000A.json", material=natural_germanium, registry=reg)


def test_ppc(test_data_configs):
def test_ppc(test_data_configs, reg, natural_germanium):
PPC(test_data_configs + "/P99000A.json", material=natural_germanium, registry=reg)


def test_semicoax(test_data_configs):
def test_semicoax(test_data_configs, reg, natural_germanium):
SemiCoax(
test_data_configs + "/C99000A.json", material=natural_germanium, registry=reg
)


def test_v07646a():
def test_v07646a(reg, natural_germanium):
V07646A(configs.V07646A, material=natural_germanium, registry=reg)


def test_p00664p():
def test_p00664p(reg, natural_germanium):
P00664B(configs.P00664B, material=natural_germanium, registry=reg)


def test_v02162b():
def test_v02162b(reg, natural_germanium):
V02162B(configs.V02162B, material=natural_germanium, registry=reg)


def test_v02160a():
def test_v02160a(reg, natural_germanium):
V02160A(configs.V02160A, material=natural_germanium, registry=reg)


def test_make_icpc(test_data_configs):
gedet = make_hpge(test_data_configs + "/V99000A.json")
def test_make_icpc(test_data_configs, reg):
gedet = make_hpge(test_data_configs + "/V99000A.json", registry=reg)
assert isinstance(gedet, InvertedCoax)

assert len(gedet._decode_polycone_coord()[0]) == len(gedet.surfaces) + 1


def test_make_bege(test_data_configs):
gedet = make_hpge(test_data_configs + "/B99000A.json")
def test_make_bege(test_data_configs, reg):
gedet = make_hpge(test_data_configs + "/B99000A.json", registry=reg)
assert isinstance(gedet, BEGe)

assert len(gedet._decode_polycone_coord()[0]) == len(gedet.surfaces) + 1


def test_make_ppc(test_data_configs):
gedet = make_hpge(test_data_configs + "/P99000A.json")
def test_make_ppc(test_data_configs, reg):
gedet = make_hpge(test_data_configs + "/P99000A.json", registry=reg)
assert isinstance(gedet, PPC)

assert len(gedet._decode_polycone_coord()[0]) == len(gedet.surfaces) + 1


def test_make_semicoax(test_data_configs):
gedet = make_hpge(test_data_configs + "/C99000A.json")
def test_make_semicoax(test_data_configs, reg):
gedet = make_hpge(test_data_configs + "/C99000A.json", registry=reg)
assert isinstance(gedet, SemiCoax)

assert len(gedet._decode_polycone_coord()[0]) == len(gedet.surfaces) + 1


def make_v07646a():
gedet = make_hpge(configs.V07646A)
def make_v07646a(reg):
gedet = make_hpge(configs.V07646A, registry=reg)
assert isinstance(gedet, V07646A)

assert len(gedet._decode_polycone_coord()[0]) == len(gedet.surfaces) + 1


def test_make_p00664b():
gedet = make_hpge(configs.P00664B)
def test_make_p00664b(reg):
gedet = make_hpge(configs.P00664B, registry=reg)
assert gedet.mass
assert isinstance(gedet, P00664B)

assert len(gedet._decode_polycone_coord()[0]) == len(gedet.surfaces) + 1

gedet = make_hpge(
configs.P00664B, name="P00664B_bis", allow_cylindrical_asymmetry=False
configs.P00664B,
name="P00664B_bis",
allow_cylindrical_asymmetry=False,
registry=reg,
)
assert isinstance(gedet, PPC)
assert not isinstance(gedet, P00664B)
assert isinstance(gedet.solid, geant4.solid.GenericPolycone)


def test_make_v02162b():
gedet = make_hpge(configs.V02162B)
def test_make_v02162b(reg):
gedet = make_hpge(configs.V02162B, registry=reg)
assert gedet.mass
assert isinstance(gedet, V02162B)

assert len(gedet._decode_polycone_coord()[0]) == len(gedet.surfaces) + 1


def test_make_v02160a():
gedet = make_hpge(configs.V02160A)
def test_make_v02160a(reg):
gedet = make_hpge(configs.V02160A, registry=reg)
assert gedet.mass
assert isinstance(gedet, V02160A)

assert len(gedet._decode_polycone_coord()[0]) == len(gedet.surfaces) + 1


def test_null_enrichment():
def test_null_enrichment(reg, natural_germanium):
metadata = configs.V07646A
metadata.production.enrichment = None
make_hpge(metadata, registry=reg, material=natural_germanium, name="my_gedet")

0 comments on commit 8fe4c52

Please sign in to comment.