Page History
...
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() |
...