Using PlateMaker through DOS, simulating all required data

Preparing the test environment

Cleaning the working directory

The examples here assume a clean working directory, which needs to be set by the data_dir parameter in the PLATEMAKER role definition in the example platemaker.ini file, found in $PLATEMAKER_DIR/etc.

Make sure the parent directory exists:

>>> from os import mkdir
>>> try:
...     mkdir('/tmp/test_platemaker_data')
... except FileExistsError:
...     pass

but the test subdirectory does not. (PlateMaker generates it automatically.):

>>> from shutil import rmtree
>>> try:
...     rmtree('/tmp/test_platemaker_data/54321')
... except FileNotFoundError:
...     pass

Preparing to interact using PML

The architect with a PlateMaker role needs to be up and running, and the environment variables need to be set up so that the python process can find it, for example with dos_env.csh.

Then, start a python interactive process and establish a connection to the PlateMaker role:

>>> from DOSlib.PML import dos_connection
>>> pm = dos_connection('PLATEMAKER')
>>> pm.execute('configure')
'SUCCESS'

Using nfssim to simulate PlateMaker inputs

The nfssim command creates simulated data for sending to succeeding PlateMaker steps, except for those data produced by fvcsim (see below):

>>> ra, decl = 187.7, 12.4 ;# the Virgo cluster, just for fun
>>> pm.execute('set', instrument='desi', seq_id=54321)
'SUCCESS'
>>> pm.execute('nfssim', coords=(ra, decl))
54321

If you want to use default coordinates, just leave off the coords keyword parameter.

Simulated data can now be retrieved:

>>> nfs_data = pm.execute('get', 'nfs_data')
>>> assignments = pm.execute('get', 'assignments')
>>> fiducial_pos = pm.execute('get', 'fiducial_pos')
>>> initial_merged_fvc_spots = pm.execute('get', 'merged_fvc_spots')
>>> gfa_images = pm.execute('get', 'gfa_images')
>>> fvc_image = pm.execute('get', 'fvc_image')

Running nfsproc

We have already set the seq_id and instrument, so we don’t need to do it again.

nfsproc can be run thus:

>>> pm.execute('nfsproc', assignments=assignments)
'SUCCESS'

After nfsproc is run, the data can be retrieved thus:

>>> nfs_data = pm.execute('get', 'nfs_data')
>>> fiducial_pos = pm.execute('get', 'fiducial_pos')
>>> center = pm.execute('get', 'center')
>>> prism = pm.execute('get', 'prism')

Running fidproc

The next step is running fidproc, which can be run thus:

>>> pm.execute('set', merged_fvc_spots=initial_merged_fvc_spots)
'SUCCESS'
>>> pm.execute('fidproc')
'SUCCESS'

>>> fiber_pos = pm.execute('get', 'fiber_pos')
>>> positioner_pos = pm.execute('get', 'positioner_pos')

Running posproc

nfsproc and fidproc produce their own guesset at positioner_true, so ask for it so we can feed it back as test data. Note that PlateMaker already has this version of the data, so this isn’t really necessary, except to better match non-simulation operations in the following step.

>>> positioner_true = pm.execute('get', 'positioner_true')

The next step is running posproc, which can be run thus:

>>> pm.execute('set', positioner_true=positioner_true)
'SUCCESS'
>>> pm.execute('posproc')
'SUCCESS'

>>> fiber_pos = pm.execute('get', 'fiber_pos')

Running gfaproc

gfaproc can be run thus:

>>> pm.execute('gfaproc', gfa_images=gfa_images)
'SUCCESS'

After gfaproc is run, the data can be retrieved thus:

>>> gfa_guide = pm.execute('get', 'gfa_guide')
>>> gfa_center = pm.execute('get', 'gfa_center')
>>> gfa_data = pm.execute('get', 'gfa_data')

Note that the gfa_data parameter is not expected to be useful except as input to fvcproc, and even then probably will never need to be retrieved explicitly.

Running fvcsim

FVC analysis now needs to be simulated. Note that the image to be analyzed was created by nfssim, above:

>>> pm.execute('fvcsim', fvc_image=fvc_image)
'SUCCESS'

The simulated data can now be retrieved, if desired:

>>> merged_fvc_spots = pm.execute('get', 'merged_fvc_spots')

Running fvcproc

fvcproc can be run thus:

>>> pm.execute('fvcproc', merged_fvc_spots=merged_fvc_spots)
'SUCCESS'

After fvcproc is run, the data can be retrieved thus:

>>> positioner_corr = pm.execute('get', 'positioner_corr')
>>> fibermap = pm.execute('get', 'fibermap')