Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

 common_mode - returns array of the common mode parameters

Difference between compound and regular detector

Detector interface provides for user uniform access to any detector data and hides specific detector complexity. The same is valid for compound detector. There is a couple of differences too keep in mind.

  • the 1-st parameter of Detector class object should be
    • detector name in regular case
    • string or list of detector names in case of compound detector
  • calibration constants for compound detector components needs to be calibrated and provided separately. All data access and processing methods work for separate detectors and their output arrays are concatenated at return.

Code example

Compound Detector object creation

There are a few options of the detector object initialization usyng class AreaDetectorCompound directly or through the standard Detector factory.

...

Detector is a standard wrapper for all LCLS detectors including AreaDetectorCompound. Compound detector object can be created usind generic Detector, e.g.

Code Block
import psana
# DataSource object MUST be defined before Detector.
ds = psana.DataSource(dsname) # i.e. dsname='exp=xpptut15:run=460'
det = psana.Detector(<str-or-list-of-derector-names>)

AreaDetectorCompound object

Example of direct AreaDetectorCompound object initialization:

Code Block
from Detector.AreaDetectorCompound import AreaDetectorCompound
det = AreaDetectorCompound(<str-or-list-of-derector-names>, env)

Input parameters

Parammeter <str-or-list-of-derector-names> can be the space separated string of detector names prepended by keyword 'compound', e.g.

...

Second parameter, env = ds.env(), is mandatory for AreaDetectorCompound and is optional for Detector (passed from  DataSource initialization).

...

Complete example

Code Block
### Direct usage:
# from Detector.AreaDetectorCompound import AreaDetectorCompound
# det = AreaDetectorCompound(..., env)

import psana
from Detector.GlobalUtils import print_ndarr

ds = psana.DataSource('exp=xpptut15:run=460')

# Make Detector object using:
# space separated string of detector names prepended by 'compound':
det = psana.Detector('compound MecTargetChamber.0:Cspad2x2.1'\
                             ' MecTargetChamber.0:Cspad2x2.2'\
                             ' MecTargetChamber.0:Cspad2x2.3')

# or list of string detector names:
det = psana.Detector(['MecTargetChamber.0:Cspad2x2.1',\
                      'MecTargetChamber.0:Cspad2x2.2',\
                      'MecTargetChamber.0:Cspad2x2.3'])

env = ds.env()
evt = ds.events().next()
rnum = evt.run()

if True :
    print 'rnum     :', rnum
    print 'calibdir :', str(env.calibDir())
    print 'size     :', str(det.list_size(evt))
    print 'shapes   :', str(det.list_shape(evt))
    print 'ndims    :', str(det.list_ndim(evt))

    raws = det.list_raw(evt)
    for nda in raws : print_ndarr(nda, name='-- per det list_raw', first=0, last=5)

    raw = det.raw(evt)
    print_ndarr(raw, name='raw as nda', first=0, last=5)

    calib = det.calib(evt)
    print_ndarr(calib, name='calib', first=0, last=5)

    xy0_offset = (550,550)
    img_raw   = det.image(evt, nda_in=raw, xy0_off_pix=xy0_offset)
    #img_calib = det.image(evt, nda_in=calib, xy0_off_pix=xy0_offset)
    #img_at_z  = det.image_at_z(evt, zplane=500000, nda_in=raw, xy0_off_pix=xy0_offset)

    if True : # True or False for to plot image or not 
        from pyimgalgos.GlobalGraphics import plotImageLarge, show
        img = img_raw
        plotImageLarge(img, title='img as %s' % str(img.shape), amp_range=(0,5000))
        show()

...