Example#

Exposure test with real camera#

Start lvmcam.

$ poetry run container_start --kill --name=lvm.cam.real

In another terminal, start clu.

$ clu

In clu terminal, type following commands step-by-step.

$ clu
lvm.cam.real connect -v -n sci.agw
00:34:52.026 lvm.cam.real >
00:34:56.271 lvm.cam.real i {
    "CAMERA": {
        "name": "sci.agw",
        "uid": "19283193"
    }
}
00:34:56.282 lvm.cam.real :
lvm.cam.real expose -v -r 00h42m44s -d 41d16m09s -K 10 -f 1800 0.1 3 sci.agw
00:35:15.462 lvm.cam.real >
00:35:17.716 lvm.cam.real : {
    "PATH": {
        "0": "/home/mgjeon/lvmcam/python/lvmcam/assets/lvm/sci/agw/20211203/lvm.sci.agw-00000001.fits",
        "1": "/home/mgjeon/lvmcam/python/lvmcam/assets/lvm/sci/agw/20211203/lvm.sci.agw-00000002.fits",
        "2": "/home/mgjeon/lvmcam/python/lvmcam/assets/lvm/sci/agw/20211203/lvm.sci.agw-00000003.fits"
    }
}
lvm.cam.real expose -v -r 00h42m44s -d 41d16m09s -K 10 -f 1800 1 3 sci.agw
00:35:22.831 lvm.cam.real >
00:35:27.655 lvm.cam.real : {
    "PATH": {
        "0": "/home/mgjeon/lvmcam/python/lvmcam/assets/lvm/sci/agw/20211203/lvm.sci.agw-00000004.fits",
        "1": "/home/mgjeon/lvmcam/python/lvmcam/assets/lvm/sci/agw/20211203/lvm.sci.agw-00000005.fits",
        "2": "/home/mgjeon/lvmcam/python/lvmcam/assets/lvm/sci/agw/20211203/lvm.sci.agw-00000006.fits"
    }
}

If you start lvmcam with --debug option, you can see verbosity.

$ poetry run container_start --debug --kill --name=lvm.cam.real
[DEBUG]: [1.307 s]: find_all_available_cameras
[DEBUG]: [1.640 s]: async _connect_internal
[DEBUG]: [1.641 s]: async connect_available_camera
[DEBUG]: [1.253 s]: get_cam_dev_for_header
[DEBUG]: [0.599 s]: async _expose_internal
[DEBUG]: [0.596 s]: async _expose_internal
[DEBUG]: [0.595 s]: async _expose_internal
[DEBUG]: [2.234 s]: async expose_real_cam
[DEBUG]: [1.499 s]: async _expose_internal
[DEBUG]: [1.496 s]: async _expose_internal
[DEBUG]: [1.495 s]: async _expose_internal
[DEBUG]: [4.821 s]: async expose_real_cam

Exposure test with virtual camera#

Start lvmtan, lvmpwi, and skymakercam as follows.

For lvmtan:

$ git clone https://github.com/sdss/lvmtan
$ cd lvmtan
$ poetry install
$ poetry run container_start --name=lvm.all

For lvmpwi:

$ git clone https://github.com/sdss/lvmpwi
$ cd lvmpwi
$ poetry install
$ poetry run container_start --name=lvm.sci.pwi --simulator

For skymakercam:

$ sudo apt-get install -y libxcb-xinerama0
$ git clone https://github.com/sdss/skymakercam
$ cd skymakercam
$ poetry install
$ poetry run python utils/plot_skymakercam.py -v -c python/skymakercam/etc/cameras.yaml lvm.sci.agw.cam

Start lvmcam with --virtual option.

$ poetry run container_start --kill --virtual --name=lvm.cam.virtual

In another terminal, start clu.

$ clu

In clu terminal, type following commands step-by-step.

$ clu
lvm.cam.virtual connect -n lvm.sci.agw.cam
10:07:35.459 lvm.cam.virtual >
10:07:36.592 lvm.cam.virtual i {
    "CAMERA": {
        "name": "lvm.sci.agw.cam",
        "uid": "lvm.sci.agw.cam"
    }
}
10:07:36.603 lvm.cam.virtual :
lvm.cam.virtual expose -v -r 00h42m44s -d 41d16m09s -K 10 -f 1800 0.1 3 lvm.sci.agw.cam
10:07:52.756 lvm.cam.virtual >
10:07:57.813 lvm.cam.virtual : {
    "PATH": {
        "0": "/home/mgjeon/lvmcam/python/lvmcam/assets/test/20211214/lvm.lvm.sci.agw.cam-00000001.fits",
        "1": "/home/mgjeon/lvmcam/python/lvmcam/assets/test/20211214/lvm.lvm.sci.agw.cam-00000002.fits",
        "2": "/home/mgjeon/lvmcam/python/lvmcam/assets/test/20211214/lvm.lvm.sci.agw.cam-00000003.fits"
    }
}
lvm.cam.virtual expose -v -r 00h42m44s -d 41d16m09s -K 10 -f 1800 1 3 lvm.sci.agw.cam
10:08:03.555 lvm.cam.virtual >
10:08:04.503 lvm.cam.virtual : {
    "PATH": {
        "0": "/home/mgjeon/lvmcam/python/lvmcam/assets/test/20211214/lvm.lvm.sci.agw.cam-00000004.fits",
        "1": "/home/mgjeon/lvmcam/python/lvmcam/assets/test/20211214/lvm.lvm.sci.agw.cam-00000005.fits",
        "2": "/home/mgjeon/lvmcam/python/lvmcam/assets/test/20211214/lvm.lvm.sci.agw.cam-00000006.fits"
    }
}

If you start lvmcam with --debug option, you can see verbosity.

$ poetry run container_start --debug --kill --virtual --name=lvm.cam.virtual
[DEBUG]: [SKYCAMERASYSTEM]: read configuration file from /home/mgjeon/lvmcam/python/lvmcam/etc/cameras.yaml
[DEBUG]: [0.033 s]: find_all_available_cameras
[DEBUG]: [SKYCAMERASYSTEM]: adding camera 'lvm.sci.agw.cam' with parameters {'type': 'skymakercam', 'uid': 'lvm.sci.agw.cam',
'descr': 'Guider Camera Science', 'default': {'gain': 5.0, 'binning': [4, 4]}, 'instpar': 'lvm_sci_agw_cam',
'focus_stage': 'lvm.sci.foc', 'kmirror': 'lvm.sci.km', 'tcs': 'lvm.sci.pwi', 'catalog_path': '$HOME/data/catalog/gaia',
'pixsize': 9.0, 'pixscal': 8.92, 'connection': {'uid': '19283193', 'gain': 1.0, 'binning': [1, 1], 'autoconnect': True,
'bool': {'ReverseY': True, 'ReverseX': False, 'BlackLevelClampingEnable': False, 'GammaEnable': False},
'int': {'BinningHorizontalMode': 1, 'BinningVerticalMode': 1}, 'float': None, 'string': None}, 'shutter': False,
'extrahdr': [['TEST1', 9999, 'Extra header test 1'], ['TEST2', 999, 'Extra header test 2'], ['TESTHDR3', -1, 'Extra header test 3'],
['TESTHDR4', -2, 'Extra header test 4']], 'path': {'basename': 'lvm.{camera.name}-{num:08d}.fits',
'dirname': "test/{date.strftime('%Y%m%d')}", 'filepath': 'python/lvmcam/assets'}}
[DEBUG]: [LVM.SCI.AGW.CAM]: [1600, 1100]
[DEBUG]: [LVM.SCI.AGW.CAM]: connecting ...
[DEBUG]: [LVM.SCI.AGW.CAM]: camera connected.
[DEBUG]: [0.048 s]: async connect_available_camera
[DEBUG]: [LVM.SCI.AGW.CAM]: defocus 0.0
[DEBUG]: [LVM.SCI.AGW.CAM]: kmirror angle (deg): 0.0
[DEBUG]: [LVM.SCI.AGW.CAM]: separation 6.068631324108885
Gaia query:  SELECT source_id, ra,dec,phot_g_mean_mag FROM gaiaedr3.gaia_source WHERE phot_g_mean_mag <= 17 AND 1=CONTAINS(POINT('ICRS',ra,dec),
CIRCLE('ICRS',48.198614693649,-58.535399463189, 0.692887394120578))
INFO: Query finished. [astroquery.utils.tap.core]
1163 stars found within 0.692887394120578 deg
[DEBUG]: [LVM.SCI.AGW.CAM]: defocus 0.0
[DEBUG]: [LVM.SCI.AGW.CAM]: kmirror angle (deg): 0.0
[DEBUG]: [LVM.SCI.AGW.CAM]: separation 1.5447622919059536
[DEBUG]: [LVM.SCI.AGW.CAM]: defocus 0.0
[DEBUG]: [LVM.SCI.AGW.CAM]: kmirror angle (deg): 0.0
[DEBUG]: [LVM.SCI.AGW.CAM]: separation 1.6575005324400047
[DEBUG]: [5.046 s]: async expose_cam
[DEBUG]: [LVM.SCI.AGW.CAM]: defocus 0.0
[DEBUG]: [LVM.SCI.AGW.CAM]: kmirror angle (deg): 0.0
[DEBUG]: [LVM.SCI.AGW.CAM]: separation 3.82851967502365
[DEBUG]: [LVM.SCI.AGW.CAM]: defocus 0.0
[DEBUG]: [LVM.SCI.AGW.CAM]: kmirror angle (deg): 0.0
[DEBUG]: [LVM.SCI.AGW.CAM]: separation 3.9465993299925985
[DEBUG]: [LVM.SCI.AGW.CAM]: defocus 0.0
[DEBUG]: [LVM.SCI.AGW.CAM]: kmirror angle (deg): 0.0
[DEBUG]: [LVM.SCI.AGW.CAM]: separation 4.062583024766025
[DEBUG]: [0.954 s]: async expose_cam

Test shot#

The --testshot or -t option in expose command makes one testshot.fits file that is always overwritten. The NUM argument of expose is ignored.

$ clu
lvmcam connect
10:14:07.696 lvmcam >
10:14:08.828 lvmcam i {
    "CAMERA": {
        "name": "lvm.sci.agw.cam",
        "uid": "lvm.sci.agw.cam"
    }
}
10:14:08.842 lvmcam :
lvmcam expose -t 0.1 3 lvm.sci.agw.cam
10:14:15.496 lvmcam >
10:14:19.892 lvmcam : {
    "PATH": {
        "0": "/home/mgjeon/lvmcam/python/lvmcam/assets/testshot.fits"
    }
}
lvmcam connect
10:14:26.887 lvmcam >
10:14:26.888 lvmcam e {
    "error": "Cameras are already connected"
}
10:14:26.890 lvmcam f
lvmcam disconnect
10:14:29.898 lvmcam >
10:14:29.899 lvmcam i {
    "text": "Cameras have been removed"
}
10:14:29.901 lvmcam :

Show commands#

The ‘Available’ means that the camera can be connected.

$ clu
lvmcam show all
10:14:55.454 lvmcam >
10:14:55.491 lvmcam i {
    "ALL": {
        "lvm.sci.agw.cam": "Available | uid: lvm.sci.agw.cam",
        "sci.agw": "Unavailable | uid: 19283193",
        "sci.age": "Unavailable | uid: 19283182",
        "sci.agc": "Unavailable | uid: -100",
        "skyw.agw": "Unavailable | uid: -2",
        "skyw.age": "Unavailable | uid: -3",
        "skyw.agc": "Unavailable | uid: -101",
        "skye.agw": "Unavailable | uid: -4",
        "skye.age": "Unavailable | uid: -5",
        "skye.agc": "Unavailable | uid: -102",
        "spec.agw": "Unavailable | uid: -6",
        "spec.age": "Unavailable | uid: -7",
        "spec.agc": "Unavailable | uid: -103"
    }
}
10:14:55.507 lvmcam :

lvmcam show connection shows all connected cameras. This reply is similar to that of lvmcam connect.

$ clu
lvmcam show connection
10:15:19.205 lvmcam >
10:15:19.206 lvmcam e {
    "error": "There are no connected cameras"
}
10:15:19.207 lvmcam f
lvmcam connect
10:15:24.475 lvmcam >
10:15:25.614 lvmcam i {
    "CAMERA": {
        "name": "lvm.sci.agw.cam",
        "uid": "lvm.sci.agw.cam"
    }
}
10:15:25.624 lvmcam :
lvmcam show connection
10:15:28.656 lvmcam >
10:15:28.657 lvmcam i {
    "CONNECTED": {
        "name": "lvm.sci.agw.cam",
        "uid": "lvm.sci.agw.cam"
    }
}
10:15:28.658 lvmcam :

Status command#

$ clu
lvmcam status
00:30:46.707 lvmcam >
00:30:48.080 lvmcam i {
    "STATUS": {
        "Camera model": "Blackfly S BFS-PGE-16S7M",
        "Camera vendor": "FLIR",
        "Camera id": "19283193",
        "Pixel format": "Mono16",
        "Available Formats": "['Mono8', 'Mono16', 'Mono10Packed', 'Mono12Packed', 'Mono10p', 'Mono12p']",
        "Full Frame": "1608x1104",
        "ROI": "1600x1100 at 0,0",
        "Frame size": "3520000 Bytes",
        "Frame rate": "3.392067663337556 Hz",
        "Exposure time": "0.999999 seconds",
        "Gain Conv.": "LCG",
        "Gamma Enable": "False",
        "Gamma Value": "0.800048828125",
        "Acquisition mode": "SingleFrame",
        "Framerate bounds": "(min=1.0, max=3.3953648380635064)",
        "Exp. time bounds": "(min=14.0, max=30000003.0)",
        "Gain bounds": "(min=0.0, max=47.994294033026364)",
        "Power Supply Voltage": "9.76171875 V",
        "Power Supply Current": "0.28369140625 A",
        "Total Dissiapted Power": "2.716955542564392 W",
        "Camera Temperature": "33.5 C"
    }
}
00:30:48.088 lvmcam :

Extra header#

You can add an extra header in result fits file.

1. Using --header or -h option#

The --header option is passed ‘JSON header’ similar to archon. The rule for ‘JSON header’ is {Header1: (Value1, Comment1), Header2: (Value2, Comment2) ...}.

$ clu
lvmcam expose 0.1 1 sci.agw --header '{"HDRTEST1": (8888, "extra hdr TEST 1"), "HDRTEST2": ("test value", "test comment"), "HDRTEST3": (-8, "extra hdr test 3")}'
04:55:22.919 lvmcam >
04:55:23.617 lvmcam : {
    "PATH": {
        "0": "/home/mgjeon/lvmcam/python/lvmcam/assets/lvm/sci/agw/20211212/lvm.sci.agw-00000001.fits"
    }
SIMPLE  =                    T / conforms to FITS standard
BITPIX  =                   16 / array data type
NAXIS   =                    3 / number of array dimensions
NAXIS1  =                 1600
NAXIS2  =                 1100
NAXIS3  =                    1
EXTEND  =                    T
BSCALE  =                    1
BZERO   =                32768
CAMNAME = 'sci.agw '           / Camera name
CAMUID  =             19283193 / Camera UID
IMAGETYP= 'object  '           / The image type of the file
EXPTIME =                  0.1 / Exposure time of single integration [s]
DATE-OBS= '2021-12-12T04:55:59.912' / Date (in TIMESYS) the exposure started
PXFORMAT= 'Mono16  '           / Pixel format
FULLFRAM= '1608x1104'          / Full Frame
ROI     = '1600x1100 at 0,0'   / ROI
FRAMSIZE=              3520000 / Frame size (Bytes)
FRAMRATE=    3.392067663337556 / Frame rate (Hz)
EXPTIME =             0.099996 / Exposure time (seconds)
GAINCONV= 'LCG     '           / Gain Conv.
GAMMAENA=                    F / Gamma Enable
GAMMAVAL=       0.800048828125 / Gamma Value
ACQUIMOD= 'SingleFrame'        / Acquisition mode
FRMRATBD= '(min=1.0, max=3.3953648380635064)' / Framerate bounds
EXPTIMBD= '(min=14.0, max=30000003.0)' / Exp. time bounds
GAINBD  = '(min=0.0, max=47.994294033026364)' / Gain bounds
VOLTAGE =         9.7451171875 / Power Supply Voltage (V)
CURRENT =        0.18115234375 / Power Supply Current (A)
POWER   =     1.23955225944519 / Total Dissiapted Power (W)
CAMTEMP =                 38.5 / Camera Temperature (C)
HDRTEST1=                 8888 / extra hdr TEST 1
HDRTEST2= 'test value'         / test comment
HDRTEST3=                   -8 / extra hdr test 3
CHECKSUM= 'ZXnDcUl9ZUlCbUl9'   / HDU checksum updated 2021-12-12T13:55:23
DATASUM = '2816880889'         / data unit checksum updated 2021-12-12T13:55:23
END

2. Using --extraheader or -eh option#

The --extraheader option allows extrahdr in cameras.yaml to be added.

# cameras.yaml
cameras:
  sci.agw:
    name: "sci.agw"
    ...
    extrahdr: [
       ['TEST1',               9999, "Extra header test 1"],
       ['TEST2',                999, "Extra header test 2"],
       ['TESTHDR3',    -1, "Extra header test 3"],
       ['TESTHDR4',    -2, "Extra header test 4"]
      ]
$ clu
lvmcam expose 0.1 1 sci.agw --extraheader
04:57:15.148 lvmcam >
04:57:15.850 lvmcam : {
    "PATH": {
        "0": "/home/mgjeon/lvmcam/python/lvmcam/assets/lvm/sci/agw/20211212/lvm.sci.agw-00000002.fits"
    }
SIMPLE  =                    T / conforms to FITS standard
BITPIX  =                   16 / array data type
NAXIS   =                    3 / number of array dimensions
NAXIS1  =                 1600
NAXIS2  =                 1100
NAXIS3  =                    1
EXTEND  =                    T
BSCALE  =                    1
BZERO   =                32768
CAMNAME = 'sci.agw '           / Camera name
CAMUID  =             19283193 / Camera UID
IMAGETYP= 'object  '           / The image type of the file
EXPTIME =                  0.1 / Exposure time of single integration [s]
DATE-OBS= '2021-12-12T04:57:52.146' / Date (in TIMESYS) the exposure started
PXFORMAT= 'Mono16  '           / Pixel format
FULLFRAM= '1608x1104'          / Full Frame
ROI     = '1600x1100 at 0,0'   / ROI
FRAMSIZE=              3520000 / Frame size (Bytes)
FRAMRATE=    3.392067663337556 / Frame rate (Hz)
EXPTIME =             0.099996 / Exposure time (seconds)
GAINCONV= 'LCG     '           / Gain Conv.
GAMMAENA=                    F / Gamma Enable
GAMMAVAL=       0.800048828125 / Gamma Value
ACQUIMOD= 'SingleFrame'        / Acquisition mode
FRMRATBD= '(min=1.0, max=3.3953648380635064)' / Framerate bounds
EXPTIMBD= '(min=14.0, max=30000003.0)' / Exp. time bounds
GAINBD  = '(min=0.0, max=47.994294033026364)' / Gain bounds
VOLTAGE =         9.7451171875 / Power Supply Voltage (V)
CURRENT =       0.264404296875 / Power Supply Current (A)
POWER   =    2.065127372741699 / Total Dissiapted Power (W)
CAMTEMP =               38.625 / Camera Temperature (C)
TEST1   =                 9999 / Extra header test 1
TEST2   =                  999 / Extra header test 2
TESTHDR3=                   -1 / Extra header test 3
TESTHDR4=                   -2 / Extra header test 4
CHECKSUM= 'ReALSZ4LRb9LRZ9L'   / HDU checksum updated 2021-12-12T13:57:15
DATASUM = '1576855900'         / data unit checksum updated 2021-12-12T13:57:15
END

Compression#

The -c or --compress option is to choose one of the compression algorithms.

You can choose one of [‘NO’, ‘R1’, ‘RO’, ‘P1’, ‘G1’, ‘G2’, ‘H1’] that respectively represent [‘None’, ‘RICE_1’, ‘RICE_ONE’, ‘PLIO_1’, ‘GZIP_1’, ‘GZIP_2’, ‘HCOMPRESS_1’].

$ lvmcam start --debug
[DEBUG]: [0.997 s]: async _expose_internal
[DEBUG]: [1.101 s]: async expose_real_cam
[DEBUG]: [0.995 s]: async _expose_internal
[DEBUG]: [1.183 s]: async expose_real_cam
[DEBUG]: [0.996 s]: async _expose_internal
[DEBUG]: [1.170 s]: async expose_real_cam
[DEBUG]: [0.996 s]: async _expose_internal
[DEBUG]: [1.092 s]: async expose_real_cam
[DEBUG]: [0.996 s]: async _expose_internal
[DEBUG]: [1.225 s]: async expose_real_cam
[DEBUG]: [0.995 s]: async _expose_internal
[DEBUG]: [1.217 s]: async expose_real_cam
[DEBUG]: [0.995 s]: async _expose_internal
[DEBUG]: [1.178 s]: async expose_real_cam
$ clu
lvmcam connect
05:28:26.621 lvmcam >
05:28:30.889 lvmcam i {
    "CAMERA": {
        "name": "sci.agw",
        "uid": "19283193"
    }
}
lvmcam expose -v -c NO 0.5 1 sci.agw
05:28:59.416 lvmcam >
05:29:00.515 lvmcam : {
    "PATH": {
        "0": "/home/mgjeon/lvmcam/python/lvmcam/assets/lvm/sci/agw/20211212/lvm.sci.agw-00000001.fits"
    }
}
lvmcam expose -v -c R1 0.5 1 sci.agw
05:29:06.219 lvmcam >
05:29:07.404 lvmcam : {
    "PATH": {
        "0": "/home/mgjeon/lvmcam/python/lvmcam/assets/lvm/sci/agw/20211212/lvm.sci.agw-00000002.fits"
    }
}
lvmcam expose -v -c RO 0.5 1 sci.agw
05:29:11.742 lvmcam >
05:29:12.912 lvmcam : {
    "PATH": {
        "0": "/home/mgjeon/lvmcam/python/lvmcam/assets/lvm/sci/agw/20211212/lvm.sci.agw-00000003.fits"
    }
}
lvmcam expose -v -c P1 0.5 1 sci.agw
05:29:17.297 lvmcam >
05:29:18.389 lvmcam : {
    "PATH": {
        "0": "data out of range for PLIO compression (0 - 2**24)"
    }
}
lvmcam expose -v -c G1 0.5 1 sci.agw
05:29:24.555 lvmcam >
05:29:25.778 lvmcam : {
    "PATH": {
        "0": "/home/mgjeon/lvmcam/python/lvmcam/assets/lvm/sci/agw/20211212/lvm.sci.agw-00000004.fits"
    }
}
lvmcam expose -v -c G2 0.5 1 sci.agw
05:29:29.583 lvmcam >
05:29:30.801 lvmcam : {
    "PATH": {
        "0": "/home/mgjeon/lvmcam/python/lvmcam/assets/lvm/sci/agw/20211212/lvm.sci.agw-00000005.fits"
    }
}
lvmcam expose -v -c H1 0.5 1 sci.agw
05:29:35.534 lvmcam >
05:29:36.712 lvmcam : {
    "PATH": {
        "0": "/home/mgjeon/lvmcam/python/lvmcam/assets/lvm/sci/agw/20211212/lvm.sci.agw-00000006.fits"
    }
}
$ ls -alh
total 14M
drwxrwxr-x 2 mgjeon mgjeon 4.0K Dec 12 14:29 .
drwxrwxr-x 5 mgjeon mgjeon 4.0K Dec 12 14:26 ..
-rw-rw-r-- 1 mgjeon mgjeon 3.4M Dec 12 14:29 lvm.sci.agw-00000001.fits
-rw-rw-r-- 1 mgjeon mgjeon 2.3M Dec 12 14:29 lvm.sci.agw-00000002.fits
-rw-rw-r-- 1 mgjeon mgjeon 2.3M Dec 12 14:29 lvm.sci.agw-00000003.fits
-rw-rw-r-- 1 mgjeon mgjeon 1.9M Dec 12 14:29 lvm.sci.agw-00000004.fits
-rw-rw-r-- 1 mgjeon mgjeon 1.8M Dec 12 14:29 lvm.sci.agw-00000005.fits
-rw-rw-r-- 1 mgjeon mgjeon 1.7M Dec 12 14:29 lvm.sci.agw-00000006.fits

Docker#

Clone the lvmcam repository.

$ git clone https://github.com/sdss/lvmcam
$ cd lvmcam
$ poetry install

Run container.

$ poetry run container_start

Run container with killing current instance.

$ poetry run container_start --kill

Run container with custom name (default name = lvm.cam).

$ poetry run container_start --name=lvm.cam.sci.agw

Run container with lvmcam debug mode.

$ poetry run container_start --debug

Run container with virtual camera (skymakercam) mode.

$ poetry run container_start --virtual

Run multiple containers.

$ poetry run container_start --name=lvm.cam.sci.agw
$ poetry run container_start --name=lvm.cam.sci.age
$ poetry run container_start --name=lvm.cam.sci.agc

Build.

$ poetry run container_build

Build from scratch.

$ poetry run container_build --no-cache

cluplus#

from clu.client import AMQPClient
from cluplus.proxy import Proxy

amqpc = AMQPClient(name="my_client")

_foc = Proxy(amqpc, "lvm.cam.virtual")
_foc.start()

# print(_foc.ping())
# print(_foc.help())
# print(_foc.version())

print(_foc.show("all"))
print(_foc.connect(name="lvm.sci.agw.cam"))
print(_foc.expose(0.5, 3, "lvm.sci.agw.cam", verbose="", compress="R1"))
print(_foc.show("connection"))
print(_foc.disconnect())