cloak.toggle.type = default

Devices and datatypes used by the LCLS instruments

Here's a brief intro to: How to find the right data in the xtc/HDF5 files? What datatypes come out of which devices?

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 

Data types: TimepixConfig, TimepixData

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_TimepixConfig, self.addr )

    def event(self, evt, env):
        frame = evt.get(TypeId.Type.Id_TimepixData, self.addr )
        image = frame.data()

BldData, beam line data

Data types: BldDataEBeam, BldDataEBeam0

Psana code

Pyana code

    def __init__ ( self ):
        pass

    def beginjob(self, evt, env):
        pass

    def event(self, evt, env):
        ebeam = evt.getEBeam()
        if ebeam is not None: 
            beamDmgM = ebeam.uDamageMask
            beamChrg = ebeam.fEbeamCharge
            beamEnrg = ebeam.fEbeamL3Energy
            beamPosX = ebeam.fEbeamLTUPosX
            beamPosY = ebeam.fEbeamLTUPosY
            beamAngX = ebeam.fEbeamLTUAngX
            beamAngY = ebeam.fEbeamLTUAngY           

Data types: FEEGasDetector

Psana code

Pyana code

    def __init__ ( self ):
        pass

    def beginjob(self, evt, env):
        pass

    def event(self, evt, env):
        fee_energy_array = evt.getFeeGasDet()
        # an array of 4 energy measurements

Data types: PhaseCavity

Psana code

Pyana code

    def __init__ ( self ):
        pass

    def beginjob(self, evt, env):
        pass

    def event(self, evt, env):
        pc = evt.getPhaseCavity()
        if pc is not None:
            fitTime1 = pc.fFitTime1 
            fitTime2 pc.fFitTime2 
            charge1 = pc.fCharge1 
            charge2 = pc.fCharge2 

Data types: SharedIpimb, BldDataIpm

Psana code

Pyana code

    def __init__ ( self, addr = "" ):
        self.addr = addr

    def beginjob(self, evt, env):
        pass

    def event(self, evt, env):
        ipm = evt.get(xtc.TypeId.Type.Id_SharedIpimb, self.addr )
        if ipm is not None: 

            # raw counts
            ch0 = ipm.ipimbData.channel0Volts()
            ch1 = ipm.ipimbData.channel1Volts()
            ch2 = ipm.ipimbData.channel2Volts()
            ch3 = ipm.ipimbData.channel3Volts()
          
            # fex values and derived quantities
            channels = ipm.ipmFexData.channel
            sum = ipm.ipmFexData.sum
            xpos = ipm.ipmFexData.xpos
            ypos = ipm.ipmFexData.ypos

ControlData

ControlPV, MonitorPV

EPICS process variables

EvrData, event receiver data