No description
  • Python 99.5%
  • Just 0.4%
  • Shell 0.1%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
linarphy 32dc2da36c
All checks were successful
/ test (push) Successful in 1m11s
Add analysis to all result sub-object
2026-10-11 17:44:59 +02:00
.forgejo/workflows
hooks
src/backscattermeter_analyzer
tests
display.py
justfile
LICENSE
mise.toml
pyproject.toml
README.md
utils.py

Backscattermeter analyzer

Help working with the backscattermeter at LAPP.

This tools can characterize the experiment itself, or make { f } _ { sc } or BRDF measurement with a focus on uncertainty propagation.

Getting started

Requirements

  • Python >= 3.14
  • GWpy >= 3.0.12 (data type, computation)
  • pyusb >= 1.3.1 (interaction with actuator/sensor - not used yet)
  • pyqt6 >= 6.9.1 (visualization - not used yet)
  • rich >= 13.9.4 (console output)
  • lalsuite >= 7.26.15 (data format - not used yet)

Installation

To install this package in the current python environment, use

python -m pip install backscattermeter_analyzer

Usage

from backscattermeter_analyzer import (
    Acquisition,
    AnalysisBuilder,
    Backscattermeter,
    Camera,
    ProtocolBuilder,
)
from gwpy.timeseries import TimeSeriesDict

# build a protocol with a camera that save the position of the beam and
# with a snail movement of the motor.
protocol = (
    ProtocolBuilder(Backscattermeter())
    .with_camera_on_suspended_bench(
        camera=Camera(
            id_="an nice identifier of the camera for human",
            serial_number="1359",
        ),
        position=3e-2,  # in m
        error=5e-3,  # in m
    )
    .with_camera_channels(  # X and Y are reversed on this camera !
        pos_x="V1:Camera_scatter_FitPosY",
        pos_y="V1:Camera_scatter_FitPosX",
    )
    .with_snail_motor_path(
        number=3,
        duration=10,
        speed=50,
        step_numbers=(100, 100, 100, 100),
    )
    .build()
)
# convert it to an acquisition with real data
acquisition = Acquisition(
    protocol=protocol,
    data=TimeSeriesDict.read("data.gwf"),
)

# build an analysis where we will get the time interval in which the
# motor is moving. We don't want these data as they are noisy, so this
# can be used later for another analysis that needs stable segment.
analysis = AnalysisBuilder().with_step_split([acquisition]).build()

# run the analysis, return a result object
result = analysis.run()

print(result.representation.structure.with_step_split[0].start_times[0])
# this will print the start of the segment that contains transition data
# in camera position measurement.

Documentation

A complete documentation will be available soon, in a wiki.

Development

Development Requirements

This project use mise to manage development tools.

Tip

If mise is installed, and mise.toml is trusted with mise trust, all tools can be installed automatically with mise install

This project use the following tools:

  • just: command runner
  • hatch: project manager and package builder
  • uv: package installer
  • ruff: python linter and formatter
  • ty: python type checker
  • jujutsu: version control

Note

Tools used in the project consume and produce interoperable format to avoid vendor lock-in. This is the toolchain of the current maintener.

Development Usage

just can be used to speed up development for an identical toolchain.

Before making a commit, just fix will run all tests, format the code, lint and type check. If you don’t want to modify the code, just check will run all tests, lint and type check without any attempt to fix any issue.

Before a version change, just release will push all local commits to repository and publish the new package version.

All available commands can be listed with just -l.

License

This project is licensed under the GNU GPL v3+. See license file for more information.

Acknowledgement

Thanks to all the people that worked on the tools used, like python, neovim and mise.