You are viewing an old version of this page. View the current version.
Compare with Current
View Page History
« Previous
Version 11
Next »
Devices and datatypes used by the LCLS instruments
A limited number of devices are in use in LCLS, but new ones occasionally gets added, so if you see anything missing, let me know, and please see the Pyana or Psana for the most up to date information. You can also take a look at (the possibly outdated) pdsdata reference manual.
Basic code snippets are given below for how to access this data in pyana and psana. For more elaborate examples, see Pyana user examples, Psana user examples and the packages pyana_examples and psana_examples.
Detector Info
The following devices are used in these detector locations and produce data classified as "DetInfo", detector info.
The "address" of a particular datatype in the XTC files are typically given contain the "detector" and "device" names and ID. For more details, see e.g. Psana User Manual -> Data Source Address .
Data types: AcqConfig, AcqWaveform
Psana code
Pyana code
from pypdsdata.xtc import TypeId
def __init__ ( self, addr = "" ):
self.addr = addr
def beginjob(self, evt, env):
config = env.getAcqConfig(self.addr)
self.channels = config.nbrChannels()
def event(self, evt, env):
for ch in self.channels:
acqData = evt.getAcqValue(self.addr, ch, env)
time_wf = acqData.timestamps()
volt_wf = acqData.waveform()
Data types: IpimbConfig, IpmFexConfig, IpimbData, IpmFex
Psana code
Pyana code
from pypdsdata.xtc import TypeId
def __init__ ( self, addr = "" ):
self.addr = addr
def beginjob(self, evt, env):
config = env.getConfig( xtc.TypeId.Type.Id_IpimbConfig , self.addr )
def event(self, evt, env):
ipm_raw = evt.get(xtc.TypeId.Type.Id_IpimbData, self.addr )
ipm_fex = evt.get(xtc.TypeId.Type.Id_IpmFex, self.addr )
Data types: EncoderConfig, EncoderData
Psana code
Pyana code
from pypdsdata.xtc import TypeId
def __init__ ( self, addr = "" ):
self.addr = addr
def beginjob(self, evt, env):
config = env.getConfig( xtc.TypeId.Type.Id_EncoderConfig , self.addr )
self.channel = None
try: # only for ConfigV2 and higher
self.channel = 0
while ( (config._chan_mask & (1<<self.channel==0 )):
self.channel+=1
except:
pass
def event(self, evt, env):
data = evt.get(xtc.TypeId.Type.Id_EncoderData, self.addr )
if self.channel is not None:
value = encoder.value( self.channel )
else :
value = encoder.value() )
Data types: Opal1kConfig, Frame
Psana code
Pyana code
from pypdsdata.xtc import TypeId
def __init__ ( self, addr = "" ):
self.addr = addr
def beginjob(self, evt, env):
config = env.getConfig(TypeId.Type.Id_Opal1kConfig, self.addr )
def event(self, evt, env):
frame = evt.get(TypeId.Type.Id_Frame, self.addr )
image = frame.data()
Data types: TM6740Config, Frame
Psana code
Pyana code
from pypdsdata.xtc import TypeId
def __init__ ( self, addr = "" ):
self.addr = addr
def beginjob(self, evt, env):
config = env.getConfig(TypeId.Type.Id_TM6740Config, self.addr )
def event(self, evt, env):
frame = evt.get(TypeId.Type.Id_Frame, self.addr )
image = frame.data()
Data types: PrincetonConfig, PrincetonFrame
Psana code
Pyana code
from pypdsdata.xtc import TypeId
def __init__ ( self, addr = "" ):
self.addr = addr
def beginjob(self, evt, env):
config = env.getConfig(TypeId.Type.Id_PrincetonConfig, self.addr )
def event(self, evt, env):
frame = evt.get(TypeId.Type.Id_PrincetonFrame, self.addr )
image = frame.data()
Data types: FccdConfig, Frame
Psana code
Pyana code
from pypdsdata.xtc import TypeId
def __init__ ( self, addr = "" ):
self.addr = addr
def beginjob(self, evt, env):
config = env.getConfig(TypeId.Type.Id_FccdConfig, self.addr )
def event(self, evt, env):
frame = evt.get(TypeId.Type.Id_Frame, self.addr )
image = frame.data()
# convert to 16-bit integer
image.dtype = np.uint16
Data types: pnCCDconfig, pnCCDframe
Psana code
Pyana code
from pypdsdata.xtc import TypeId
def __init__ ( self, addr = "" ):
self.addr = addr
def beginjob(self, evt, env):
config = env.getConfig(TypeId.Type.Id_pnCCDconfig, self.addr )
def event(self, evt, env):
frame = evt.get(TypeId.Type.Id_pnCCDframe, self.addr )
image = frame.data()
Data types: CspadConfig, CspadElement
Psana code
Pyana code
from pypdsdata.xtc import TypeId
def __init__ ( self, addr = "" ):
self.addr = addr
def beginjob(self, evt, env):
config = env.getConfig(TypeId.Type.Id_CspadConfig, self.addr )
self.sections = map(config.sections, range(4))
# keep this list of sections in use by each quad
def event(self, evt, env):
elements = evt.get(TypeId.Type.Id_CspadElement, self.addr )
# elements is a python list of CspadElement objects
# To fully populate a 4x8x185x388 array (standard used by pedestal files),
# create array of zeros and fill in what we have
pixel_array = np.zeros((4,8,185,388), dtype="uint16")
for e in elements :
data = e.data() # 8x185x388
quad = e.quad() # integer
for n,s in enumerate(self.sections[quad]) :
pixel_array[quad,s] = data[n]
To plot, take a look at examples in XtcExplorer for now.
Data types: CspadConfig, Cspad2x2Element
Psana code
Pyana code
from pypdsdata.xtc import TypeId
def __init__ ( self, addr = "" ):
self.addr = addr
def beginjob(self, evt, env):
config = env.getConfig(TypeId.Type.Id_CspadConfig, self.addr )
def event(self, evt, env):
element = evt.get(TypeId.Type.Id_Cspad2x2Element, self.addr )
data = element.data()
# data is now a 3D array: 185x388x2
Other data types
BldData, beam line data
ControlData
ControlPV, MonitorPV
EPICS process variables
EvrData, event receiver data